wxPython中事件处理机制

时间:2021-06-30 07:13:07
#/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()