2016-09-25 3 views
1

私はstdinから入力を受け取り、cursesを使って端末にGUIを表示し、ユーザーがインタラクションを終了すると結果をstdoutに出力するpythonスクリプトを作ろうとしています。この動作の良い例はselectaですが、それはrubyで書かれています。stdinから入力を取得する方法、cursesを使用して何かを表示してstdoutに出力する方法はありますか?

cursesに何も表示させることはできません。これは、(それが唯一の1つの文字を1つの文字と待機を表示する)私がこれまで試したものの一例最小限である:

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

このようなことはcursesを使用しても可能ですか?

答えて

1

print文が同じ標準出力にcurses.wrapperとして書き込んでいるため、動作しません。あなたはsys.stdoutを復元した後まで、printことを延期するか、またはあなたは、このようなfile=プロパティ何か使用することができますあなたがにコードを修正する必要があるかのように聞こえる、他の(発注)問題について

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

refreshgetchの後ろに置いて(cursesが表示させるように)、cursesのバージョンに応じて、flushの標準出力が役立ちます。

さらに読書:

+0

ああ、はい、それは私が例を簡略化したときに私が作った間違いだが、私はそれは無関係だか、少なくとも大きな問題があると怖いです:curses output( 's.addch(ord( 'a'))')は表示されず、 's.getch()'の結果が出力される前に発生します。それにもかかわらず、コードを修正しました。 –

関連する問題