wxPython中的Skip()方法

在学习《wxPython in action》一书的过程中,一直对于event.Skip()方法存有疑惑,今天重新研究了这个问题,总结如下: 
 
一个使用Skip方法的例子:
#!/usr/bin/env python

import wx

class MouseEventFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, 'Button', size=(300,100))
        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.panel.SetBackgroundColour('White')
        self.panel.Refresh() 
       

if __name__=='__main__':
    app=wx.PySimpleApp()
    frame=MouseEventFrame(parent=None, id=-1)
    frame.Show()
    app.MainLoop()
这段代码中在一个button上绑定了三个事件,其中有两个进入窗口(按钮)的事件。运行会发现当光标移动到按钮之上时,面板颜色变红,而按钮上的文字并未发生改变。也就是说对于同一组件上同一类型的事件,wxPython只处理了其中的一个。这时候就轮到我们的Skip方法出场了,取消OnEnterWindow2()方法中注释掉的Skip方法,运行后将会看到光标移动到按钮之上,两个处理过程都被触发了。

因此,在wxPython中,如果一个动作会触发多个事件,那么应该使用Skip方法来保证每个都被处理到。经过测试,我发现后绑定的事件会被先处理,所以以上的代码只在OnEnterWindow2()中调用了Skip方法。其实为了保证不遗漏,在每个事件处理的方法中都调用Skip方法应该是一种良好的习惯。

你可能感兴趣的:(wxPython中的Skip()方法)