Seite 1 von 1

IrcLib & wxPython: Endlosschleife

Verfasst: Freitag 5. Januar 2007, 16:35
von fred.reichbier
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

Verfasst: Freitag 5. Januar 2007, 17:08
von Andy
Bitte löschen

Re: IrcLib & wxPython: Endlosschleife

Verfasst: Freitag 5. Januar 2007, 19:27
von gerold
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
:-)

Verfasst: Samstag 6. Januar 2007, 17:24
von fred.reichbier
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