Realmente tienes dos opciones. Uno puede dejar el modo Cursas, ejecutar su programa y luego reanudar las maldiciones. Dos, puede ejecutar su programa de forma asincrónica, analizar su salida y escribirlo en la pantalla.
La buena noticia sobre la primera opción es que en realidad no necesita escribir ningún método Fancy Save_state / Load_state para la interfaz de usuario. Maldiciones hace esto por ti. Aquí hay un ejemplo simple para mostrar mi 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)
Si ejecuta el ejemplo, notará que la pantalla creada por curses.wrapper
y el creado en curses.initscr
Cuando se reanudan son el mismo objeto. Es decir, la ventana devuelta por curses.initscr
es un singleton. Esto nos permite salir de maldiciones y reanudar como anteriormente sin tener que actualizar cada widget self.screen
Referencias cada vez.
La segunda opción es mucho más involucrada pero también mucho más flexible. Lo siguiente es solo para representar la idea 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()
Luego en algún lugar de su programa querrá llamar update
en todos sus procesos en un temporizador. Esto le brinda la opción de hacer su subwindow de cualquier tamaño/lugar para que pueda tener tantos procesos que se ajusten. Tendrá que agregar algún manejo para cuando el proceso termine y otros eventos similares, por supuesto.