Você realmente tem duas opções. Um você pode deixar o modo de maldição, executar seu programa e retomar as maldições. Segundo, você pode executar seu programa de forma assíncrona, analisar sua saída e escrevê -lo na tela.
A boa notícia sobre a primeira opção é que você realmente não precisa escrever nenhum método sofisticado SAVE_STATE / LOAD_STATE para a interface do usuário. Maldições faz isso por você. Aqui está um exemplo simples para mostrar meu ponto
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)
Se você executar o exemplo, você notará que a tela criada por curses.wrapper
e o criado em curses.initscr
Quando a retomada é o mesmo objeto. Isto é, a janela devolvida por curses.initscr
é um singleton. Isso nos permite sair maldições e currículo como acima sem ter que atualizar cada widget self.screen
referências a cada vez.
A segunda opção é muito mais envolvida, mas também muito mais flexível. O seguinte é apenas para representar a idéia básica.
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()
Então em algum lugar do seu programa, você vai querer ligar update
em todos os seus procwidgets em um cronômetro. Isso oferece a opção de fazer com que sua subwindow qualquer tamanho/local, para que você possa ter tantos procwidgets quanto for adequado. Você precisará adicionar algum manuseio para quando o processo terminar e outros eventos semelhantes, é claro.