gpt4 book ai didi

python - wxpython 的 wxEvent.Skip() 解释

转载 作者:太空宇宙 更新时间:2023-11-04 09:06:44 25 4
gpt4 key购买 nike

我最近在通过wxPython in Action学习wxPython,但是卡在了第3章,尤其是图3.3的解释的 Skip() 钻石

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

If a binder isn't found for the object itself, the processing walks up the class hierarchy to find a binder defined in a superclass of the object--(1)this is different than the walk up in the container hierarchy that happens in the next step.

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

The event handler asks for more processing by calling the wx.Event method Skip(). If the Skip() method is called, processing continues and (2)any handlers defined in the (3)superclass are found and executed in the step. The Skip() method can be called at any point in the handler. The Skip() method sets a flag in the event instance, which wxPython checks after the handler method is complete. In listing 3.3 the OnButtonClick() doesn't call Skip(), so in that case the event process is complete at the end of the handler method. The other two event handlers do call Skip() (4)so the system will keep searching for a matching event binding, (5)eventually invoking the default functionality for mouse enter and leave events for the native widget, such as mouse-over events.

我的问题与我在文章中标记的数字有关:

(1) 根据我的理解和其他一些谷歌搜索的 Material ,传播 是容器层次结构中发生的事情,不是类层次结构,这是正确的吗?

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

(3) 这里的superclass是否正确?不应该是父窗口吗?

(4) 我认为这一行与问题 2 相矛盾,所以可能不会执行任何 处理程序,只执行与实例和事件组合匹配的处理程序?

(5) 什么是默认功能?它是如何被调用的?

如果有人感兴趣,listing-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()

最佳答案

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

  1. wxApp::FilterEvent()
  2. 任何事件处理程序 pushed on对象本身。我什至不确定这是否在 wxPython 中公开,无论如何不应再使用它。
  3. 对象本身,从在大多数派生类中注册的处理程序开始,继续在基类中定义的处理程序。
  4. 如果事件是“可传播的”(wxCommandEvent 默认情况下是这种情况,但不是,比如说 wxMouseEvent)并且如果对象是一个窗口,那么所有对象的父窗口,递归地。
  5. wxTheApp 本身。
  6. 最后,使用底层工具包级别的事件默认处理程序。它做什么,如果有的话,取决于确切的事件类型和平台,但对于某些事件,让它被调用非常重要,特别是对于焦点事件,您必须让默认的 native 控件处理程序获取它们以更新它们专注状态。

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

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

关于python - wxpython 的 wxEvent.Skip() 解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19901537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com