Vous avez vraiment deux choix. Celui que vous pouvez laisser le mode malédiction, exécuter votre programme, puis reprendre les malédictions. Deux, vous pouvez exécuter votre programme de manière asynchrone, analyser sa sortie et l'écrire à l'écran.
La bonne nouvelle sur la première option est que vous n'avez pas vraiment besoin d'écrire des méthodes SAVE_STATE / LOAD_STATE pour l'interface utilisateur. Les malédictions font cela pour vous. Voici un exemple simple pour montrer mon point
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 vous exécutez l'exemple, vous remarquerez que l'écran créé par curses.wrapper
Et celui créé dans curses.initscr
Lors du reprise sont le même objet. C'est-à-dire que la fenêtre est retournée par curses.initscr
est un singleton. Cela nous permet de quitter les malédictions et de reprendre comme ci-dessus sans avoir à mettre à jour chaque widget self.screen
références à chaque fois.
La deuxième option est beaucoup plus impliquée mais aussi beaucoup plus flexible. Ce qui suit est simplement de représenter l'idée de 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()
Ensuite, quelque part dans votre programme, vous voudrez appeler update
sur tous vos Prowidgets sur une minuterie. Cela vous donne la possibilité de faire de votre sous-fenêtre n'importe quelle taille / lieu afin que vous puissiez avoir autant de Prowidgets que cela conviendra. Vous devrez ajouter un peu de traitement lorsque le processus se termine et d'autres événements similaires bien sûr.