<span style="font-size:18px;">import wx
class MouseEventFrame(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id,'Button',size = (300,200))
self.panel = wx.Panel(self)
self.panel.SetBackgroundColour('White')
self.button = wx.Button(self.panel,label="Not Over",pos=(100,15))
self.button.Bind(wx.EVT_ENTER_WINDOW,self.OnEnterWindow)
self.button.Bind(wx.EVT_ENTER_WINDOW,self.OnEnterWindow2)
self.button.Bind(wx.EVT_LEAVE_WINDOW,self.OnLeaveWindow)
def OnEnterWindow(self,event):
self.button.SetLabel('Over Me')
def OnEnterWindow2(self,event):
self.panel.SetBackgroundColour('Red')
self.panel.Refresh()
event.Skip()
def OnLeaveWindow(self,event):
self.button.SetLabel('Not Over')
self.SetBackgroundColour('Blue')
self.panel.Refresh()
if __name__ == '__main__':
app = wx.PySimpleApp()
frame= MouseEventFrame(parent=None,id=-1)
frame.Show()
app.MainLoop()</span>
这段代码中在一个button上绑定了三个事件,其中有两个进入窗口(按钮)的事件。运行会发现当光标移动到按钮之上时,面板颜色变红,而按钮上的文字并未发生改变。也就是说对于同一组件上同一类型的事件,wxPython只处理了其中的一个。这时候就轮到我们的Skip方法出场了,取消OnEnterWindow2()方法中注释掉的Skip方法,运行后将会看到光标移动到按钮之上,两个处理过程都被触发了。
因此,在wxPython中,如果一个动作会触发多个事件,那么应该使用Skip方法来保证每个都被处理到。经过测试,我发现后绑定的事件会被先处理,所以以上的代码只在OnEnterWindow2()中调用了Skip方法。其实为了保证不遗漏,在每个事件处理的方法中都调用Skip方法应该是一种良好的习惯