『已解决』wxpython如何在事件处理函数中取得触发源?

『已解决』wxpython如何在事件处理函数中取得触发源?

bind一个事件处理函数后,怎么在这个函数中取得当前触发此事件的部件呢?比如,点击一个按钮,事先并没有一个到此按钮实例的一个引用,在处理这个点击事件的函数中,怎样得到它呢?我要在处理函数中定位到事件源,然后对其相邻的下一个部件进行操作。不知道怎么做,请大家指点下,谢谢!另外,那个传到处理函数中的event参数都有什么可操作的方法呢?目前只接触过Skip(),不知道有没有可以实现我要求的方法,也不知道上哪儿查:(

最常用的方法:
event.GetId()  来得到出发来源的id,再根据这个id来找到这个item。
通过 定义一个范围, 比如说 来源是一个menuitem。
你可以这样(self为一个wx.Frame的实例):
self.GetMenuBar().FindItemById(event.GetId())    这样你就得到了这个触发事件的item。
还是以menu做例子, 你可以通过GetMenuItems()取得你这个menu里面所有menuitem的一个list。
再通过刚才的到的item,来找到它相邻的下一个item。

我也在学习wxpython。。以后多交流。
问题已解决。谢谢大家:)

通过在事件处理函数中使用print dir(event),可以看到下面这么些属性和方法:
['Checked', 'Clone', 'Destroy', 'GetClassName', 'GetClientData', 'GetClientObject', 'GetEventObject', 'GetEventType', 'GetExtraLong', 'GetId', 'GetInt', 'GetSelection', 'GetSkipped', 'GetString', 'GetTimestamp', 'IsChecked', 'IsCommandEvent', 'IsSelection', 'ResumePropagation', 'SetClientData', 'SetClientObject', 'SetEventObject', 'SetEventType', 'SetExtraLong', 'SetId', 'SetInt', 'SetString', 'SetTimestamp', 'ShouldPropagate', 'Skip', 'StopPropagation', '__class__', '__del__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'this', 'thisown']  

猜测其中红色那个也许能满足我的要求,一试果然:)python的自省能力太强了,呵呵
通过event.GetEventObject()方法得到触发事件的部件,再通过其GetName()方法即可得到它的name属性(因为我的下一个部件是要通过递增name值来取得)。以后一定好好研究下剩下的,呵呵。

另外,FindWindowById()方法在wxpython in action中有讲述,还有FindWindowByName()和FindWindowByLabel(),这三个方法都能够通过某些已知的属性获得特定的部件,很是方便。这里也可以用楼上所说的GetId()方法获得事件源的id,再利用FindWindowById查找事件源,不过感觉这样多做了一步,还是上面的方法简洁^_^

呵呵,,
我再补充一下。  如果你的Event是 wx.EVT_MENU 。
而你的触发源是 wx.MenuItem 的话 ( 这是在处理菜单时很常见的情况)
用 wx.EVT_MENU.GetEventObject()   得到的将不是MenuItem 而是 Menu。

除非你对每个MenuItem单独绑定 (没人会这么做吧)