あなたには本当に2つの選択肢があります。呪いモードを離れ、プログラムを実行してから、呪いを再開できます。 2つ目は、プログラムを非同期に実行し、出力を解析して画面に書き込むことができます。
最初のオプションに関する良いニュースは、UIのファンシーSAVE_STATE / LOAD_STATEメソッドを実際に記述する必要がないことです。呪いはあなたのためにこれをします。これが私の主張を示す簡単な例です
import curses, time, subprocess
class suspend_curses():
"""Context Manager to temporarily leave curses mode"""
def __enter__(self):
curses.endwin()
def __exit__(self, exc_type, exc_val, tb):
newscr = curses.initscr()
newscr.addstr('Newscreen is %s\n' % newscr)
newscr.refresh()
curses.doupdate()
def main(stdscr):
stdscr.addstr('Stdscreen is %s\n' % stdscr)
stdscr.refresh()
time.sleep(1)
with suspend_curses():
subprocess.call(['ls'])
time.sleep(1)
stdscr.refresh()
time.sleep(5)
curses.wrapper(main)
例を実行すると、によって作成された画面が curses.wrapper
で作成されたもの curses.initscr
再開するときは同じオブジェクトです。つまり、ウィンドウが返されます curses.initscr
シングルトンです。これにより、各ウィジェットを更新することなく、上記のように呪いや再開を終了できます self.screen
毎回参照。
2番目のオプションははるかに関与していますが、はるかに柔軟になります。以下は、基本的なアイデアを表すためだけです。
class procWidget():
def __init__(self, stdscr):
# make subwindow / panel
self.proc = subprocess.Popen(my_args, stdout=subprocess.PIPE)
def update(self):
data = self.proc.stdout.readline()
# parse data as necessary
# call addstr() and refresh()
それからあなたのプログラムのどこかであなたは電話したいと思うでしょう update
タイマー上のすべてのProcWidgets。これにより、サブウィンドウを任意のサイズ/場所に作成するオプションが得られるため、収まるだけのプロシッジを使用できます。もちろん、プロセスが終了し、他の同様のイベントが終了したときにいくつかのハンドリングを追加する必要があります。