IrcLib & wxPython: Endlosschleife

Plattformunabhängige GUIs mit wxWidgets.
Antworten
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Hallo,

ich benutze die Python IRCLib zusammen mit wxPython um unter Windows einen kleinen IRC-Client mit GUI zu programmieren - funktioniert auch soweit.
Nun ist es aber so, dass die IRC-Klasse eine Endlosschleife startet, um alle Nachrichten, die vom IRC-Server kommen auszuwerten.
Während dieser Endlosschleife bleibt aber meine Grafische Oberfläche mit wxPython stehen, so, als wäre das Programm abgestürzt, sie zeichnet sich nicht mehr neu und reagiert nicht auf Mausklicks. Beende ich die Schleife mit STRG+C, tut sie das wieder ;)
Meine Frage - gibt es eine Anweisung in wxPython, die ich in dieser Schleife aufrufe, die das Programm 'weiterführt'? In Delphi gabs dafür Application.ProcessMessages, ich suche also so etwa das gleiche in Python. Oder gibts da einen ganz anderen Lösungsweg?

Danke schonmal,

Fred
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Bitte löschen
Zuletzt geändert von Andy am Dienstag 9. Januar 2007, 20:06, insgesamt 1-mal geändert.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

fred.reichbier hat geschrieben:Während dieser Endlosschleife bleibt aber meine Grafische Oberfläche mit wxPython stehen, so, als wäre das Programm abgestürzt, sie zeichnet sich nicht mehr neu und reagiert nicht auf Mausklicks.
Hallo Fred!

Du musst deine Endlosschleife in einen eigenen Thread verschieben. Ansonsten blockiert sie die GUI.

Schau dir mal diesen Thread an:
http://www.python-forum.de/post-48358.html#48358
Besonders den Bereich "Und so funktioniert es mit Thread".

Hier geht es auch um das gleiche Thema: http://www.python-forum.de/topic-8609.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Hi,

Andy: Deins war nicht das was ich brauchte ;) Trotzdem danke :)
gerold: Ich hab es jetzt so etwa hingekriegt, und zwar mit app.Yield():

Code: Alles auswählen

    def Process(self):
        if len(self.servers) > 0:
            self.servers[0].ircobj.process_once(0.2) ##todo:alle server##
            self.app.Yield()
            self.log.FlushActive()
            wx.Sleep(0.2)
            if self.process == True:
                wx.CallAfter(self.Process)
Läuft aber sehr schleppend. Ich werde mir das mit den Threads mal ansehen, danke!

mfg fred
Antworten