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
