关于event.Skip()

时间:2012-07-23 03:20:11

标签: wxpython

我想调用OnstaticDown,并使用event.Skip()来调用它的父窗口小部件onPanelDown

但是只调用OnstaticDown,我不明白为什么。为什么static的父母小组没有收到该活动?

我的代码:

 self.panel.Bind(wx.EVT_LEFT_DOWN,self.onPanelDown)
 self.static = wx.StaticText(self.panel, wx.NewId(), "First Name",pos=(10, 50),size=(100,100))
 self.static.Bind(wx.EVT_LEFT_DOWN, self.OnstaticDown)

 def onPanelDown(self,event):
        print 'panel-------------22'
 def OnstaticDown(self,event):
        print 'static============11'
        event.Skip()

1 个答案:

答案 0 :(得分:4)

event.Skip()将调用控件默认处理程序(即StaticText)。我不相信静态文本有一个默认的处理程序,因为它不是为了与之交互而设计的,它只是一个用于显示文本的标签。

你可以在静态向下处理事件后将事件发布到面板,wx.PostEvent(self.panel,event)或者我认为传递它self.onPanelDown(event)不是不好的做法,尽管它不会也适合改变。

您总是可以创建一个函数来将事件传递/发布到控件父级

def PostToParent(control,event):
    wx.PostEvent(control.GetParent(),event)

<小时/> 修改: 这不是它的工作原理,只有一些类型的事件传播到父窗口小部件(wx.CommandEvent层次结构中的事件,鼠标事件不属于它们)。尝试在静态文本上注释掉绑定,如果你单击它就不会触发面板向左,因为你点击的是静态文本,而不是面板。 event.Skip()只会标记事件并允许在运行处理程序后传播到其他绑定,如果你不这样做,并且事件不会再发生。

最明显的例子是,如果你关闭一个窗口,框架会发出一个EVT_CLOSE事件,wx会选择并关闭窗口。如果将方法绑定到EVT_CLOSE,它将在底层wx事件处理程序之前触发。如果你没有调用event.Skip,那么当你试图关闭它时,事件将永远不会到达wx处理程序并且框架不会关闭,但是如果你调用event.Skip它将由wx事件处理处理后的处理程序,然后关闭框架。

另一方面,

wx.PostEvent是一种将事件发送到特定小部件的方法,并且具有绑定到该特定事件的任何绑定,处理该事件。在这种情况下,将左下方事件转发到面板与自己单击面板具有相同的效果。