Shellbefehl in TKinter richtig ausführen?

Fragen zu Tkinter.
Antworten
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

Hallo,

Ich will eine Gui für einen shellbefehl schreiben. Ich hab eben in TKinter erstmal ein paar buttons angelegt, unter anderem einen start button, dieser soll den shellbefehl starten. Das mache ich mittels os.popen(befehl). Nun hab ich aber das Problem, das die Gui nicht reagiert solang das shellprogramm läuft. Ich hab auch versucht das programm mittels thread.start_new_thread() zu starten, aber das scheints auch nicht zu bringen.

Wie starte ich sowas ohne das die Gui während der Laufzeit hängt?

Weiterhin gibt das shellprogramm zwischendurch statusmeldungen raus. Wie kann ich diese abfangen? Ich weiss das ich ein os.popen() in eine variable setzen kann, aber als ich das grad probiert hab, erfolgte die ausgabe scheinbar erst nachdem der befehl durch war. Wie macht man das noch?
Thx.
BlackJack

@Arp: Für das Starten von externen Programmen sollte man das `subprocess`-Modul verwenden, welches alle anderen Möglichkeiten wie `os.popen*()` ersetzen soll. Threads sollten mit dem `threading`-Modul umgesetzt werden — `thread` ist veraltet.

Du könntest den Shellbefehl in einem eigenen Thread starten, die Ausgabe(n) abfangen und Zeilenweise in eine Queue schreiben und mit der `after()`-Methode auf Tkinter-Widgets regelmässig diese Queue abfragen und deren Inhalt der GUI hinzufügen. Man darf nämlich nur aus dem Thread in dem die `mainloop()` läuft, auf die GUI zugreifen.

Wirklich in Echtzeit bekommst Du die Ausgabe so nicht, weil das gestartete Programm seine Ausgabe eventuell puffert. Ob diese Verzögerung ein Problem ist, musst Du ausprobieren. Falls ja, müsstest Du dem externen Programm vorspiegeln, dass es mit einem Terminal verbunden ist. Zum Beispiel mit dem `pexpect`-Modul und in dem Du selbst etwas in der Richtung bastelst.
Antworten