wxpython的wxEvent.Skip()解释道

she*_*ngy 1 python events wxwidgets wxpython

我最近学习wxPython通过wxPython in Action,但我被困在第3章,特别是对的解释Figure 3.3Skip()钻石

Step 3 Locating the binder object,书中写道:

如果没有找到对象本身的绑定器,则处理在类层次结构中向上查找在对象的超类中定义的绑定 - (1)这与在容器层次结构中的向上走动不同下一步.

但在下一步中,Step 4 Determining whether to continue processing写道:

事件处理程序通过调用wx.Event方法Skip()来请求更多处理.如果调用Skip()方法,则继续处理,并且(2)在步骤中找到并执行在(3)超类中定义的任何处理程序.可以在处理程序中的任何位置调用Skip()方法.Skip()方法在事件实例中设置一个标志,wxPython在处理程序方法完成后进行检查.在清单3.3中,OnButtonClick()不调用Skip(),因此在这种情况下,事件处理在处理程序方法结束时完成.另外两个事件处理程序会调用Skip()(4),因此系统将继续搜索匹配的事件绑定,(5)最终调用鼠标进入和离开事件的默认功能,例如鼠标悬停事件.

我的问题与我在段落中标记的数字有关:

(1)在我的理解和其他一些googled材料中,传播是在容器层次结构中发生的事情,而不是类层次结构,这是正确的吗?

(2)说真的吗?任何处理程序都被执行?不是匹配实例和事件组合的那些?

(3)这里的超类是否正确?不应该是父窗户吗?

(4)我认为这一行与question2相矛盾,所以也许没有执行任何处理程序,只是匹配实例和事件组合的处理程序?

(5)什么是default functionality?它是如何被调用的?

如果有人有兴趣,list-3.3.py就在这里:

import wx


class MouseEventFrame(wx.Frame):

    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, 'Mouse Events',
                          size=(300, 200))
        self.panel = wx.Panel(self)
        self.button = wx.Button(self.panel,
                                label='Not Over', pos=(100, 15))
        self.Bind(wx.EVT_BUTTON, self.OnButtonClick, self.button)
        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')
        event.Skip()


if __name__ == '__main__':
    app = wx.App()
    frame = MouseEventFrame(parent=None, id=-1)
    frame.Show()
    app.MainLoop()
Run Code Online (Sandbox Code Playgroud)

VZ.*_*VZ. 5

生成与某个对象关联的事件时,处理程序查找的顺序为:

  1. wxApp :: FilterEvent()
  2. 任何事件处理程序都会推送到对象本身.我甚至不确定它是否在wxPython中公开,并且在任何情况下都不应该再使用它.
  3. 对象本身,从在大多数派生类中注册的处理程序开始,并继续使用在基类中定义的处理程序.
  4. 如果事件是"可传播的"(默认情况下是这种情况,wxCommandEvent但不是,例如wxMouseEvent),并且如果对象是窗口,则递归地对象的所有父窗口.
  5. wxTheApp 本身.
  6. 最后,使用底层工具包级别的事件的默认处理程序.它有什么作用,取决于确切的事件种类和平台,但是对于某些事件,让它被调用是非常重要的,特别是对于焦点事件,你必须让默认的本机控制处理程序获取它们以便更新它们聚焦状态.

现在,怎么样Skip()?通常,使用搜索时找到的第一个处理程序,并且事件处理在那里停止.但是,如果处理程序event.Skip()在执行期间调用,则会跳过此事件处理程序并继续搜索.即重要的是要理解的是Skip(),即使在事件对象上调用它,也不会跳过事件.相反,它会跳过调用它的事件处理程序.

希望你现在明白为什么它很重要调用event.Skip()wxFocusEvent处理程序.