wxPython中事件处理机制

#/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()

你可能感兴趣的:(wxPython)