wxpython的wxEvent.Skip()解释道

时间:2013-11-11 08:06:40

标签: python events wxpython wxwidgets

我最近通过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

1 个答案:

答案 0 :(得分:6)

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

  1. wxApp::FilterEvent()
  2. 任何事件处理程序pushed on对象本身。我甚至不确定它是否在wxPython中公开,并且在任何情况下都不应再使用它。
  3. 对象本身,从在大多数派生类中注册的处理程序开始,并继续使用在基类中定义的处理程序。
  4. 如果事件是“可传播的”(默认情况下是wxCommandEvent但不是,例如wxMouseEvent),如果对象是窗口,则该对象的所有父窗口,递归地。
  5. wxTheApp本身。
  6. 最后,使用底层工具包级别的事件的默认处理程序。它有什么作用,取决于确切的事件种类和平台,但是对于某些事件,让它被调用是非常重要的,特别是对于焦点事件,你必须让默认的本机控制处理程序获取它们以便更新它们聚焦状态。
  7. 现在,Skip()呢?通常,使用搜索时找到的第一个处理程序,并且事件处理在那里停止。但是,如果处理程序在执行期间调用event.Skip(),则会跳过此事件处理程序并继续搜索。即要理解的重要一点是,Skip()不会跳过事件,即使它在事件对象上被调用。相反,它会跳过调用它的事件处理程序。

    希望您现在明白为什么在event.Skip()处理程序中调用wxFocusEvent非常重要。