一直没有看明白wxPython的自定义事件是如何工作的。如果要自定义事件,那么需要明白事件源,事件类型,事件处理函数,以及事件绑定器; 但是我在整个过程中没有看到这几个概念是如何关联起来的。下面举例说明一下我的疑问,先看下代码:
1 #!/usr/bin/env python 2 3 #coding=utf-8 4 5 import wx 6 7 class MyTestEvent(wx.PyCommandEvent): #1 定义事件 8 9 def __init__(self, evtType, id): 10 11 wx.PyCommandEvent.__init__(self, evtType, id) 12 13 self.eventArgs = "" 14 15 16 17 def GetEventArgs(self): 18 19 return self.eventArgs 20 21 22 23 def SetEventArgs(self, args): 24 25 self.eventArgs = args 26 27 28 29 myEVT_MY_TEST = wx.NewEventType() #2 创建一个事件类型 30 31 EVT_MY_TEST = wx.PyEventBinder(myEVT_MY_TEST, 1) #3 创建一个绑定器对象 32 33 34 35 36 37 class MyFrame(wx.Frame): 38 39 40 41 def __init__(self): 42 43 wx.Frame.__init__(self, None, -1, "My Frame", size=(300, 300),pos=(300,300)) 44 45 panel = wx.Panel(self, -1) 46 47 self.button1 = wx.Button(panel,id=-1,pos=(40, 40),label="button1") 48 49 self.Bind(wx.EVT_BUTTON, self.OnButton1Click, self.button1) 50 51 self.Bind(EVT_MY_TEST, self.OnHandle)# 4绑定事件处理函数 52 53 54 55 def OnButton1Click(self,event): 56 57 self.OnDoTest() 58 59 60 61 def OnHandle(self,event):#8 事件处理函数 62 63 dlg = wx.MessageDialog(self, event.GetEventArgs(),‘A Message Box‘,wx.OK | wx.ICON_INFORMATION) 64 65 dlg.ShowModal() 66 67 dlg.Destroy() 68 69 70 71 def OnDoTest(self): 72 73 evt = MyTestEvent(myEVT_MY_TEST, self.button1.GetId()) #5 创建自定义事件对象 74 75 evt.SetEventArgs("test event") # 6添加数据到事件 76 77 self.GetEventHandler().ProcessEvent(evt) #7 处理事件 78 79 80 81 82 83 if __name__ == ‘__main__‘: 84 85 app = wx.PySimpleApp() 86 87 frame = MyFrame() 88 89 frame.Show(True) 90 91 app.MainLoop()
#1 : 创建事件类,继承自pyCommandEvent类,这个没有疑问;
#2 :创建一个事件类型,这个类似于wx.NewID,确保事件类型唯一性
#3:创建一个绑定器对象,PyEventBinder类的实例,但是这个函数一直没有明白第二个参数是做什么的?
#4:绑定器函数将绑定器对象与事件处理函数绑定起来
#5:创建自定义事件对象,这个是用来后面处理事件用的;
#6:添加数据到事件;
#7:调用ProcessEvent处理事件
整个例子,没有明白事件源是什么?是如何触发的?如何与事件处理函数关联起来的?