2016-09-25 10 views
1

Я пытаюсь создать скрипт python, который принимает входные данные от stdin, отображает GUI в терминале, используя curses, а затем, когда пользователь заканчивает взаимодействие, выводит результат на stdout. Хорошим примером такого поведения является selecta, но он написан на рубине.Как взять ввод из stdin, отобразить что-то, используя проклятия и вывести на stdout?

Я не могу заставить проклятия показывать что-либо. Это минимальный (он отображает только один символ и ждет одного символа) пример того, что я пытался до сих пор:

import os, sys 
import curses 

c = None 

old_out = sys.__stdout__ 
old_in = sys.__stdin__ 
old_err = sys.__stderr__ 
sys.__stdout__ = sys.stdout = open('/dev/tty', 'w') 
sys.__stdin__ = sys.stdin = open('/dev/tty') 
sys.__stderr__ = sys.stderr = open('/dev/tty') 


def show_a(s): 
    global c 
    s.addch(ord('a')) 
    c = s.getch() 

curses.wrapper(show_a) 

sys.stdin.flush() 
sys.stdout.flush() 
sys.stderr.flush() 
sys.stdin.close() 
sys.stdout.close() 
sys.stderr.close() 
sys.__stdout__ = sys.stdout = old_out 
sys.__stdin__ = sys.stdin = old_in 
sys.__stderr__ = sys.stderr = old_err 

print(c) 

Когда я пытаюсь не использовать echo $(python3 show_a.py) ничего не отображается, но после нажатия любой клавиши ее номер отображается:

curses displays nothing in terminal

ли что-то подобное возможно даже с помощью проклятий, если это так, как это сделать?

ответ

1

Это не работает, потому что оператор print пишет на тот же стандартный вывод, что и curses.wrapper. Вы можете отложить, что print до тех пор, после того, как вы восстановили sys.stdout, или вы могли бы использовать file= свойства что-то вроде этого:

printf(s.getch(), file=old_out) 

Для других (заказа) проблем, это звучит, как если бы вам нужно изменить код сделайте a refresh после getch (чтобы сделать проклятия его отображать), и в зависимости от какой версии проклятий тогда будет полезен флеш.

Дальнейшее чтение:

+0

О, да, это ошибка, которую я сделал, когда я был упрощая пример, но я боюсь, что это не имеет значения или, по крайней мере, есть большая проблема : вывод curses ('s.addch (ord ('a'))') не отображается, и это должно произойти до того, как будет напечатан результат 's.getch()'. Тем не менее, я исправил код, спасибо. –