Befehlsausgabe in *echtzeit* in TextView einfügen

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
bmh1980
gelöscht
Beiträge: 60
Registriert: Montag 26. Januar 2004, 17:13
Kontaktdaten:

Samstag 12. Februar 2005, 09:43

Hallo.

Da bin ich wieder. :?

Diesmal dürfte es aber auf jeden Fall eine Kleinigkeit sein, die ich übersehe.

In meinem Skript wird ein externes Programm aufgerufen, wenn der Benutzer einen Button anklickt.

Dieses Ausgabe wird in einem neuen Fenster, das lediglich einen TextView und einen Button enthält dargestellt, damit der Benutzer auch weiß, ob alles richtig funktioniert.

Mit meinem jetzigen Code (siehe unten) funktioniert das auch. Leider aber erst, wenn der Befehl beendet ist. So denkt der Benutzer erstmal, dass das Skript "hängt", oder so.

Code: Alles auswählen

while gtk.events_pending():
    gtk.main_iteration()
for item in os.popen(befehl+parameter+' 2>&1').readlines():
    textbuffer1.insert_at_cursor(item)
Ich habe bereits wie so'n kleiner Irre :wink: die PyGTK Reference durchwühlt um etwas in Richtung textubffer = std* oder Ähnliches zu finden.

Aber anscheinend gibts das nicht.

Die Idee mit gtk.events_pending oben hatte ich mal in einer Mailingliste bekommen. Aber wirklich lösen lässt sich das Problem nicht. Es hat lediglich den Vorteil, dass das Fenster überhaupt vor Beendigung des Befehls erscheint.

Habt ihr vielleicht eine Lösung für das Problem parat? So ungewöhnlich wird mein Vorhaben ja nicht sein. Gerade in *nix-Umgebungen trifft man ja häufiger auf Programme, die sich so mitteilen.

Marcus
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Samstag 12. Februar 2005, 10:35

Hi Marcus,

das mit dem events_pending ist schon gut, nur an der falschen stelle.

Code: Alles auswählen

for item in os.popen(befehl+parameter+' 2>&1').readlines():
    textbuffer1.insert_at_cursor(item)
    while gtk.events_pending():
        gtk.main_iteration()
so erhält gtk die Gelegenheit deine Ausgaben im Fenster darzustellen.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
bmh1980
gelöscht
Beiträge: 60
Registriert: Montag 26. Januar 2004, 17:13
Kontaktdaten:

Samstag 12. Februar 2005, 11:37

Kann es sein, dass man gtk.events_pending() doppelt verwenden muss?

Bisher hatte ich ja das Problem, dass der Text erst nach Beendigung des Befehls eingefügt wird.

Wenn ich es mit deinem Beispiel probiere, erscheint das Ausgabefenster ebenfalls erst nach Beendigung des Befehls.

Mit

Code: Alles auswählen

while gtk.events_pending():
    gtk.main_iteration()
    for item in os.popen(befehl+parameter+' 2>&1').readlines():
        textbuffer1.insert_at_cursor()
        while gtk.events_pending():
            gtk.main_iteration()
scheint es jetzt so zu funktionieren, wie es sein soll.

Also Fenster öffnet sich sofort und Text wird auch gleich eingefügt. Bin mir zwar noch nicht 100 %ig sicher, aber es scheint okay.

Marcus
Antworten