3

我想调用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()
4

1 回答 1

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

于 2012-07-23T09:44:59.540 回答