Ich habe ein Python-Programm, das eine Reihe von Operationen ausführt und die Antwort auf STDOUT ausgibt. Jetzt schreibe ich eine GUI, die diesen bereits existierenden Code aufruft und ich möchte den gleichen Inhalt in der GUI anstelle von STDOUT ausgeben. Ich werde das Text-Widget für diesen Zweck verwenden. Ich möchte meinen vorhandenen Code, der die Aufgabe ausführt, nicht ändern (Dieser Code wird auch von anderen Programmen verwendet).
Kann mir jemand bitte sagen, wie ich diese vorhandene Aufgabendefinition verwenden und ihr STDOUT-Ergebnis verwenden und in ein Text-Widget einfügen kann? Im GUI-Hauptprogramm möchte ich diese Taskdefinition aufrufen und ihre Ergebnisse in STDOUT ausgeben. Gibt es eine Möglichkeit, diese Informationen zu verwenden?
Sie können das wahrscheinlich lösen, indem Sie sys.stdout
durch ein eigenes dateiähnliches Objekt ersetzen, das in das Text-Widget schreibt.
Zum Beispiel:
%Vor%In python rufen Sie bei jedem Aufruf von print ('examplestring') indirekt sys.stdout.write ('examplestring') auf :
%Vor%Methode 1: Ausdruck auf GUI
%Vor%Tatsächlich rufen wir print - (callsfor) - & gt; sys.stdout.write - (callsfor) - & gt; Redirector
Methode 2: Schreiben eines Dekorators - Ausdruck auf CLI und GUI
%Vor%Was ein Dekorator tut, ist, dass er func sys.stdout.write func innerlich
zuweist %Vor%und func inner fügt eine zusätzliche Codezeile hinzu, bevor die tatsächliche sys.stdout.write
aufgerufen wirdDies ist in gewisser Weise eine Aktualisierung der älteren Funktion sys.stdout.write, um eine neue Funktion zu haben. Sie werden bemerken, dass ich versucht habe - außer, dass, wenn beim Drucken in das Textfeld ein Fehler aufgetreten ist, ich zumindest die ursprüngliche Funktion von sys.stdout.write auf der CLI beibehalten würde.
Methode 3: Bryan Oakleys Beispiel
%Vor%Er hat sys.stdout mit einer Methode .write (str)
der Klasse TextRedirector zugewiesenso anruft print ('string') - ruft for- & gt; sys.stdout.write ('string') -callsfor- & gt; TextRedirector.write ('Zeichenfolge')
Sie können das CLI-Programm aufrufen, indem Sie subprocess.Popen
verwenden, um das ausgegebene stdout zu erhalten. und es im Text-Widget anzeigen.
Etwas in der Art von (ungetestet):
%Vor% Beachten Sie, dass dies blockiert wird, bis das CLI-Programm ausgeführt wird und Ihre GUI eingefroren wird. Um die Blockierung zu umgehen, können Sie diesen Code in eine threading.Thread
setzen und die GUI freigeben während des Wartens auf den Abschluss des Threads aktualisieren.
Die Funktion, die normalerweise auf stdout druckt, sollte stattdessen den Text in das Text-Widget einfügen.