Sie haben wirklich zwei Möglichkeiten. Sie können den Flüchenmodus hinterlassen, Ihr Programm ausführen und dann Flüche wieder aufnehmen. Zweitens können Sie Ihr Programm asynchron ausführen, seine Ausgabe analysieren und auf den Bildschirm schreiben.
Die gute Nachricht zur ersten Option ist, dass Sie keine Fancy Save_State / Load_State -Methoden für die Benutzeroberfläche schreiben müssen. Flüche tun dies für Sie. Hier ist ein einfaches Beispiel, um meinen Standpunkt zu zeigen
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)
Wenn Sie das Beispiel ausführen, werden Sie feststellen, dass der Bildschirm von erstellt wurde curses.wrapper
und der in erstellte in curses.initscr
Bei der Wiederaufnahme sind das gleiche Objekt. Das heißt, das Fenster wurde von zurückgegeben curses.initscr
ist ein Singleton. Auf diese Weise können wir Flüche beenden und wie oben wieder aufnehmen, ohne jedes Widget aktualisieren zu müssen self.screen
Referenzen jedes Mal.
Die zweite Option ist viel besser, aber auch viel flexibler. Das Folgende ist nur die Grundidee darzustellen.
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()
Dann möchten Sie irgendwo in Ihrem Programm anrufen update
Bei all Ihren Procwidgets auf einem Timer. Dies gibt Ihnen die Möglichkeit, Ihren Unterwindow zu jeder Größe/einem Ort zu machen, sodass Sie so viele Procwidgets haben können, wie sie passen werden. Sie müssen ein gewisses Handling hinzufügen, wenn der Prozess endet und natürlich ähnliche Ereignisse.