2016-09-25 23 views
1

我想做一個python腳本,它接受來自stdin的輸入,在終端中使用curses顯示GUI,然後當用戶完成交互時,將結果輸出到stdout。這種行爲的好例子是selecta,但它是用紅寶石書寫的。如何從stdin獲取輸入,使用curses顯示某些內容並輸出到stdout?

我不能讓curses顯示任何東西。這是最小的(只顯示一個字符一個字符和等待),例如什麼我試過到目前爲止:

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相同的標準輸出。您可以推遲這print除非您已恢復sys.stdout後,或者你可以使用file=屬性是這樣的:

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

對於其他(訂貨)的問題,聽起來就好像你需要將代碼修改爲在getch之後執行refresh(以使詛咒顯示它),並且根據詛咒的版本,標準輸出的齊平將會很有幫助。

延伸閱讀:

+0

哦,是的,這是一個錯誤,我當我被簡化的例子進行,但恐怕這是不相關的,或者至少有一個更大的問題:curses output('s.addch(ord('a'))')不會顯示,這應該在s.getch()'的結果打印之前發生。不過,我修復了代碼,謝謝。 –

相關問題