wxPython: Events von einer Timer-Klasse an GUI übergeben
Verfasst: Freitag 18. Mai 2007, 20:14
Hallo!
In diesem Beispiel möchte ich aufzeigen, wie man Events von einem arbeitenden Objekt aus als Benachrichtigung zum Aktualisieren der Anzeige an ein Frame weitergeben kann.
Erklärungen zum Beispiel:
Die "MyEventTimer"-Klasse stellt einen Timer dar, der jede Sekunde ein Event auslöst.
Die "MyFrame"-Klasse bindet beim Initialisieren einen Eventhandler an die "MyEventTimer"-Klasseninstanz. Jedes Mal, wenn in der "MyEventTimer"-Klasseninstanz das Event "EVT_NEW_STATUS" ausgelöst wird, dann wird die Eventhandler-Methode des Frames ausgeführt. Diese Methode aktualisiert die Anzeige im Frame.
Siehe auch: http://www.python-forum.de/post-68192.html
mfg
Gerold

In diesem Beispiel möchte ich aufzeigen, wie man Events von einem arbeitenden Objekt aus als Benachrichtigung zum Aktualisieren der Anzeige an ein Frame weitergeben kann.
Erklärungen zum Beispiel:
Die "MyEventTimer"-Klasse stellt einen Timer dar, der jede Sekunde ein Event auslöst.
Die "MyFrame"-Klasse bindet beim Initialisieren einen Eventhandler an die "MyEventTimer"-Klasseninstanz. Jedes Mal, wenn in der "MyEventTimer"-Klasseninstanz das Event "EVT_NEW_STATUS" ausgelöst wird, dann wird die Eventhandler-Methode des Frames ausgeführt. Diese Methode aktualisiert die Anzeige im Frame.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
import wx
import wx.lib.newevent
import time
wx.SetDefaultPyEncoding("iso-8859-15")
# Event-Klasse und Eventbinder-Funktionen erstellen
(NewStatusEvent, EVT_NEW_STATUS) = wx.lib.newevent.NewEvent()
class MyEventTimer(wx.Timer):
def __init__(self):
wx.Timer.__init__(self)
self.Start(1000)
# Es wird jetzt jede Sekunde der Timer ausgelöst. Dabei wird
# jedes Mal die Methode "Notify" aufgerufen. In dieser Notify-Methode
# wird eine Event-Instanz erstellt und ausgelöst.
def Notify(self):
"""
Eine Methode mit dem Namen "Notify" wird bei jedem Timer-Event
aufgerufen, ohne dass man diese an ein Event binden muss.
Dient nur zum Simulieren von ARBEIT! ;-)
"""
# damit man sieht, dass etwas passiert...
print "Notify wird jetzt ausgefuehrt..."
# Event-Instanz erstellen
evt = NewStatusEvent()
# Aktuelle Zeit an die Event-Instanz binden
evt.current_time = time.asctime()
# Event auslösen
self.ProcessEvent(evt)
class MyFrame(wx.Frame):
def __init__(
self, parent = None, id = -1, title = "Example", size = wx.Size(550, 420)
):
wx.Frame.__init__(self, parent, id, title, size = size)
panel = wx.Panel(self)
vbox_main = wx.BoxSizer(wx.VERTICAL)
panel.SetSizer(vbox_main)
# Label zum Anzeigen des Status bzw. hier im Beispiel der Uhrzeit
self.lab_status = wx.StaticText(panel)
vbox_main.Add(self.lab_status, 0, wx.ALL, 10)
# Event der **MyEventTimer-Instanz** an Handler binden
myeventtimer = wx.GetApp().myeventtimer
myeventtimer.Bind(EVT_NEW_STATUS, self.update_status)
def update_status(self, event):
"""
Dieser Eventhandler bekommt ein Event übergeben. An dieses Event
wurde die aktuelle Zeit als Attribut ``current_time`` angehängt.
Diese wird jetzt im StaticText-Feld angezeigt.
"""
self.lab_status.SetLabel(event.current_time)
class MyApp(wx.PySimpleApp):
def OnInit(self):
self.myeventtimer = MyEventTimer()
# Ab jetzt sendet self.myeventtimer jede Sekunde ein Event
# bis die Anwendung abgebrochen wird. Gleichzeitig ist die Instanz
# auch an die App gebunden. So kann auch vom Frame aus darauf zugegriffen
# werden.
# Frame anzeigen
self.myframe = MyFrame()
self.myframe.Show()
return True
def main():
app = MyApp()
app.MainLoop()
if __name__ == "__main__":
main()
mfg
Gerold
