she*_*ngy 1 python events wxwidgets wxpython
我最近学习wxPython通过wxPython in Action,但我被困在第3章,特别是对的解释Figure 3.3的Skip()钻石
在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)
生成与某个对象关联的事件时,处理程序查找的顺序为:
wxCommandEvent但不是,例如wxMouseEvent),并且如果对象是窗口,则递归地对象的所有父窗口.wxTheApp 本身.现在,怎么样Skip()?通常,使用搜索时找到的第一个处理程序,并且事件处理在那里停止.但是,如果处理程序event.Skip()在执行期间调用,则会跳过此事件处理程序并继续搜索.即重要的是要理解的是Skip(),即使在事件对象上调用它,也不会跳过事件.相反,它会跳过调用它的事件处理程序.
希望你现在明白为什么它很重要调用event.Skip()的wxFocusEvent处理程序.
| 归档时间: |
|
| 查看次数: |
3717 次 |
| 最近记录: |