我想调用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()
答案 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
是一种将事件发送到特定小部件的方法,并且具有绑定到该特定事件的任何绑定,处理该事件。在这种情况下,将左下方事件转发到面板与自己单击面板具有相同的效果。