Aktualisierung eines Widgets in Schleife erzwingen

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Donnerstag 22. Januar 2009, 20:29

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 !
DasIch
User
Beiträge: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Donnerstag 22. Januar 2009, 20:39

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.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Donnerstag 22. Januar 2009, 20:41

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?
DasIch
User
Beiträge: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Donnerstag 22. Januar 2009, 20:58

Löse Events aus und reagiere darauf im zeichnenden Thread.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Donnerstag 22. Januar 2009, 21:46

Wie zu erwarten ändert das wenig an der Problematik, dass das Fenster den Zeichenqueue nicht abarbeitet.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Donnerstag 22. Januar 2009, 22:31

while gtk.events_pending():
gtk.main_iteration()

bitteschön
Antworten