我最近通过wxPython
学习了wxPython in Action
,但我第3章陷入困境,特别是对Figure 3.3
的{{1}}钻石的解释
在Skip()
中,该书写道:
如果找不到对象本身的活页夹,则处理过程就会开始 用于查找在超类中定义的绑定的类层次结构 object - (1)这与容器层次结构中的walk up不同 这将在下一步中发生。
但在下一步中,Step 3 Locating the binder object
写道:
事件处理程序通过调用wx.Event请求更多处理 方法Skip()。如果调用Skip()方法,则继续处理 并且(2)在(3)超类中定义的任何处理程序被找到并执行 这一步。可以在处理程序中的任何位置调用Skip()方法。 Skip()方法在事件实例中设置一个标志,即wxPython 处理程序方法完成后检查。在上市3.3中 OnButtonClick()不调用Skip(),因此在这种情况下是事件进程 在处理程序方法的末尾完成。另外两件事 处理程序会调用Skip()(4),以便系统继续搜索 匹配事件绑定,(5)最终调用默认功能 用于鼠标进入和离开本机窗口小部件的事件,例如 鼠标悬停事件。
我的问题与我在段落中标记的数字有关:
(1)在我的理解和其他一些googled材料中, propagat 是在容器层次结构中发生的事情, NOT 类层次结构,这是正确的吗?
(2)说真的? 执行任何处理程序?不是匹配实例和事件组合的那些?
(3)超类在这里是否正确?不应该是父窗口吗?
(4)我认为这一行与question2相矛盾,所以也许没有执行任何处理程序,只是那些匹配实例和事件组合的处理程序?
(5)什么是Step 4 Determining whether to continue processing
?它是如何被调用的?
如果有人有兴趣,list-3.3.py就在这里:
default functionality
答案 0 :(得分:6)
当生成与某个对象关联的事件时,处理程序查找的顺序为:
wxCommandEvent
但不是,例如wxMouseEvent
),如果对象是窗口,则该对象的所有父窗口,递归地。wxTheApp
本身。现在,Skip()
呢?通常,使用搜索时找到的第一个处理程序,并且事件处理在那里停止。但是,如果处理程序在执行期间调用event.Skip()
,则会跳过此事件处理程序并继续搜索。即要理解的重要一点是,Skip()
不会跳过事件,即使它在事件对象上被调用。相反,它会跳过调用它的事件处理程序。
希望您现在明白为什么在event.Skip()
处理程序中调用wxFocusEvent
非常重要。