最近在学习wxPython
via wxPython in Action
,但是卡在了第3章,特别是对Figure 3.3
's Skip()
diamond的解释
书中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)在我的理解和其他一些谷歌资料中,传播是容器层次结构中发生的事情,而不是类层次结构,这是正确的吗?
(2) 认真的吗?执行任何处理程序?不是匹配实例和事件组合的那些?
(3)这里的超类是正确的吗?它不应该是父窗口吗?
(4) 我认为这条线与问题2相矛盾,所以可能没有执行任何处理程序,只是那些与实例和事件组合匹配的处理程序?
(5) 什么是default functionality
? 它是如何调用的?
如果有人感兴趣,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()