У вас действительно есть два варианта. Один из них вы можете оставить режим проклятий, выполнить свою программу, а затем возобновить проклятия. Во -вторых, вы можете выполнить свою программу асинхронно, проанализировать ее вывод и написать на экране.
Хорошей новостью на первом варианте является то, что вам на самом деле не нужно писать какие -либо фантастические методы 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
ссылки каждый раз.
Второй вариант гораздо более вовлечен, но также гораздо более гибкий. Следующее - просто для представления основной идеи.
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 на таймере. Это дает вам возможность сделать ваш Subwindow в любом размере/месте, чтобы вы могли иметь столько же, сколько подойдет. Вам придется добавить некоторую обработку, когда процесс заканчивается, и другие подобные события, конечно.