Seite 1 von 1

Aktualisierung eines Widgets in Schleife erzwingen

Verfasst: Donnerstag 22. Januar 2009, 20:29
von Barabbas
Hallo zusammen,

ich habe schon öfter folgendes Problem gehabt, muss es aber dieses mal endlich lösen ;). Wenn ich eine Schleife habe - etwa um eine Datei succzessiv aus dem Netz zu laden oder ähnliches - und versuche, während des Schleifendurchlaufes in meinem GTK Fenster ein Label zu aktualisieren, geschieht dieses in der Regel erst nach Beendigung der Schleife.
Selbst wenn ich mit queue_draw() und process_update() versuche eine Aktualisierung zu erzwingen, geschieht diese entweder nur sehr zögerlich oder auch erst am Ende der Schleife.

Was ich brauche ist eine Möglichkeit, zu einem bestimmten Zeitpunkt in einer rechenintensieven Schleife eine Aktualisierung des Fensters bzw. des entsprechenden Widgets zu erzwingen. Ganz doofes Beispiel: Bis 10000 zählen und dies in einer Progressbar anzeigen. Oder folgendes - sehr einfaches - Beispiel, das ich gerade mal schnell entworfen habe - hatte leider nur nano zur Hand, darum etwas knapp:

Code: Alles auswählen

#!/usr/bin/env python

import gtk

class MyWin(gtk.Window):
        def __init__(self):
                gtk.Window.__init__(self)

                self.btn = gtk.Button("GO!!")
                self.add(self.btn)
                self.btn.connect("clicked", self.go)


                self.show_all()

        def go(self, widget):
                counter = 0
                while counter < 99999:
                        counter += 1
                        self.btn.set_label("Nummer %i" % counter)
                        self.btn.queue_draw()
                        self.btn.window.process_updates(True)

if __name__ == "__main__":
        x = MyWin()
        gtk.main()


Vielen Dank schonmal !

Verfasst: Donnerstag 22. Januar 2009, 20:39
von DasIch
Verlager rechenintensive Sachen in eigene Threads oder Prozesse. Du kannst allerdings nicht von einem anderen Thread als dem in dem die GUI läuft auf diese zugreifen.

Verfasst: Donnerstag 22. Januar 2009, 20:41
von Barabbas
eben - deswegen hilft mir das nicht wirklich weiter, oder? Abgesehen scheiden Threads eh aus, da ich Firefox via Mozplug einbinde und dieses sich nicht mit dem gtk.threading versteht - zumindest nicht, wenn zugleich Flash angezeigt wird.

Dafür muss es aber doch auch eine thread-freie Möglichkeit geben?

Verfasst: Donnerstag 22. Januar 2009, 20:58
von DasIch
Löse Events aus und reagiere darauf im zeichnenden Thread.

Verfasst: Donnerstag 22. Januar 2009, 21:46
von Barabbas
Wie zu erwarten ändert das wenig an der Problematik, dass das Fenster den Zeichenqueue nicht abarbeitet.

Verfasst: Donnerstag 22. Januar 2009, 22:31
von Barabbas
while gtk.events_pending():
gtk.main_iteration()

bitteschön