Seite 1 von 1

Problem mit GUI und Thread

Verfasst: Freitag 1. Februar 2008, 15:09
von Frank aka Ch3ck3r
Hi Community.

Ich habe ein leicht verzwicktes Problem.

Ich weiß, ich darf nur aus einem Thread auf die Gui zugreifen. Das Problem das ich nun habe, ist, dass der Inhalt der GUI alle 5 Sekunden aktualisiert werden soll.

Baue ich nun in dem Gui Thread eine while schleife mit time.sleep(5), so wird das Fenster nie angezeigt, da das Programm in der schleife ist und nicht zu MainLoop() kommt.

Baue ich die Schleife hinter MainLoop() gehts natürlich auch nicht, weil da ja davor schon das Main Loop kommt.

Also habe ich einen anderen Thread gestartet und diesem Thread die Instanz der GUI mitgegeben. Der Thread ruft dann alle 5 Sekunden eine Methode der Instanz auf.

Das klappt auch etwa 3 bis 5 mal. Spätestens beim 6. mal geht aber die Gui in die Knie, das Fenster verschwindet und vor allem ohne Fehlermeldung.

Wie kann man das Problem lösen?

Ich habe schon gedacht in der GUI mit einer Queue zu arbeiten, aber das geht ja dann wieder nicht, weil die Gui nicht zum MainLoop() kommt.

Verfasst: Freitag 1. Februar 2008, 15:38
von BlackJack
Für so etwas bieten die meisten GUI-Toolkits Methoden. Tkinter zum Beispiel mit der `after()`-Methode. Bei `wxPython` heisst's glaube ich `CallAfter()`.

Verfasst: Freitag 1. Februar 2008, 17:45
von Leonidas
PyGTK hat sogar ``gobject.timeout_add()``.

Verfasst: Freitag 1. Februar 2008, 17:55
von Frank aka Ch3ck3r
CallAfter habe ich gefunden, aber das ruft eine Methode auf, nach dem ein Event übergeben wurde. Welches event tritt bitte alle 5 sekunden auf ?

Verfasst: Freitag 1. Februar 2008, 18:11
von BlackJack
Ups, aber der Docstring von `wx.CallAfter()` verweist auf `wx.FutureCall()`, und dessen Doku erwähnt `wx.Timer`. Eines von den beiden hilft Dir hoffentlich weiter.

Verfasst: Freitag 1. Februar 2008, 18:32
von Frank aka Ch3ck3r
jo der wx.Timer ist ne gute Lösung. Thx, hätte ich wahrscheinlich nicht gefunden