2011-11-30 53 views
1

我正在創建一個使用curses構建簡單用戶界面的應用程序。它還使用subprocess模塊來運行外部文本編輯器,以便用戶可以鍵入一些文本,然後關閉編輯器並返回主程序。在curses應用程序中使用子進程

問題是,當編輯器是基於控制檯的,例如Vim或Nano時,curses不會正確地初始化。這意味着如果使用色彩模式(curses.start_color()),終端在程序結束後保持着色。

這是一個測試腳本有這個問題(至少對我來說,我使用Ubuntu和GNOME終端):

import curses 
import subprocess 

screen = curses.initscr() 
curses.noecho() 
curses.cbreak() 
screen.keypad(1) 
try: 
    curses.curs_set(0) 
except curses.error: 
    pass 
curses.start_color() 

screen.addstr(0, 0, 'hello, world!') 
screen.refresh() 

while 1: 
    c = screen.getch() 
    if c == ord('q'): 
     break 
    if c == ord('r'): 
     subprocess.call('vim', shell=False) 
     screen.clear() 
     screen.addstr(0, 0, 'hello, world!') 
     screen.refresh() 

curses.nocbreak() 
screen.keypad(0) 
curses.echo() 
curses.curs_set(1) 
curses.endwin() 

(按r進入Vim的,然後q退出)

有沒有辦法解決這個問題?

回答

0

會修改你的代碼:

if c == ord('q'): 
    subprocess.call('reset', shell=False) 
    break 

夠嗎?或者,在您的實際腳本中是否存在一些其他行爲,這些行爲不在您粘貼的代碼中,這使得此解決方法不適合您的目標?

+0

它的工作原理,但我認爲重置用戶的終端並不是那麼好,丟失了所有的回滾等。但如果我找不到更好的解決方案,我會使用它,謝謝。 – sealion

相關問題