#/usr/bin/python #-*-<coding=UTF-8>-*- """ 本例展示了wxPython的事件处理过程 """ import wx class Frame(wx.Frame): def __init__(self): wx.Frame.__init__(self,parent=None,id=-1,title="",pos=wx.DefaultPosition,size=wx.DefaultSize) self.panel = wx.Panel(self) self.button = wx.Button(self.panel,label="Not Over",pos=(100,15)) #创建<框架>绑定,将EVT_BUTTON事件与OnButtonClick()事件处理函数绑定起来. #事件源为button控件; 这个好理解 self.Bind(wx.EVT_BUTTON,self.OnButtonClick,self.button) """ 这里要讲的是,对于EVT_BUTTON首先会在button中查找事件处理器, 如果没有,则会在其父容器中查找,即在panel中查找,如果还没有,则会一直沿着顺序找到有父容器处理为止; 在此例中,panel中也没有相应的事件处理器,那最后找到self.Bind()中找到,此时self是指向*框架Frame的. 所以,如果我们在button中绑定事件处理器,效果也是一样的. 如果是这样的话,为什么还要在Frame中绑定呢? 有什么好处吗? """ #不过看起来<按钮>绑定,执行效果也是一样的. self.button.Bind(wx.EVT_BUTTON,self.OnButtonClick,self.button) #创建<按钮>绑定,将EVT_ENTER_WINDOW与OnEnterWindow/OnLeaveWindow绑定起来. self.button.Bind(wx.EVT_ENTER_WINDOW,self.OnEnterWindow) self.button.Bind(wx.EVT_LEAVE_WINDOW,self.OnLeaveWindow) def OnButtonClick(self,event): self.panel.SetBackgroundColour("Green") self.panel.Refresh() def OnEnterWindow(self,event): self.button.SetLabel("Over Me!") event.Skip() def OnLeaveWindow(self,event): self.button.SetLabel("Not Over") if __name__ == "__main__": app = wx.PySimpleApp() frame = Frame() frame.Show() app.MainLoop()