Hai davvero due scelte. Uno che puoi lasciare la modalità maledizione, eseguire il programma, quindi riprendere le maledizioni. Due, puoi eseguire il tuo programma in modo asincrono, analizzare il suo output e scriverlo sullo schermo.
La buona notizia sulla prima opzione è che in realtà non è necessario scrivere alcun metodo SAVE_STATE / CAROD_STATE Fancy per l'interfaccia utente. Le maledizioni lo fanno per te. Ecco un semplice esempio per mostrare il mio punto
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 esegui l'esempio, noterai che lo schermo creato da curses.wrapper
e quello creato in curses.initscr
Quando si riprendono sono lo stesso oggetto. Cioè, la finestra è tornata da curses.initscr
è un singleton. Questo ci consente di uscire dalle maledizioni e riprendere come sopra senza dover aggiornare ogni widget self.screen
Riferimenti ogni volta.
La seconda opzione è molto più coinvolta ma anche molto più flessibile. Quello che segue è solo rappresentare l'idea di base.
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()
Quindi da qualche parte nel tuo programma vorrai chiamare update
Su tutti i tuoi procwidget su un timer. Questo ti dà la possibilità di realizzare il tuo sottobusto in qualsiasi dimensione/luogo in modo da poter avere tutte le procwidget che si adatteranno. Dovrai aggiungere un po 'di gestione per quando il processo termina e altri eventi simili ovviamente.