wxPython学习笔记(二)
今日女女给我买了个口琴,并千叮咛万嘱咐要我勤加苦练,好在他妈妈面前秀一手。多“体贴”的女朋友了。哎,女朋友的要求就是命令啊,一会儿还要去练习,所以赶快把今天的书读完吧。 今天学习wxPython的事件驱动模型(event-driven)。wxPython中所有的事件都是wx.Event或其子类的实例罢了。这里需要区分下面两个概念:event binder是wxPython中的一个对象,它包含了一个特定控件(widget),事件类型,和响应函数的对应关系;wx.EventHandler是wxPython中的一个类,它允许她的实例实现事件,事件类型以及响应函数的绑带。
在wxPython中,一个事件类可以包含不同的事件类型。每一个事件类型都有自己的 event binder。
wxPython中任何可以响应事件的对象都是wx.EvtHandler的子类。所有的窗口对象(前面已经提到任何可见的部分实际上都可以被称作窗口对象)也是wx.EvtHandler的子类,因此所有的控件都可以响应事件。除此之外,一些非窗口对象,比如wx.App也可以响应事件。Bind()是wx.EvtHandler中的一个常用的方法。它的调用方式为:
Bind(event, handler, source=None, id1=wx.ID_ANY, id2=wx.ID_ANY)
其中的source用来指出event的出处。因为可能事件的出处并不是帮定该事件的控件。比如下面的代码:
def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, 'Frame With Button',
size=(300, 100))
panel = wx.Panel(self, -1)
button = wx.Button(panel, -1, "Close", pos=(130, 15),
size=(40, 40))
self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
self.Bind(wx.EVT_BUTTON, self.OnCloseMe, button)
def OnCloseMe(self, event):
self.Close(True)
def OnCloseWindow(self, event):
self.Destroy()
这里的binder明显是Frame,只有wx.EVT_CLOSE是Frame本身触发的,而EVT_BUTTON却不是。这时候source参数就可以明确的告诉binder这个事实。