免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4926 | 回复: 3

『已解决』wxpython如何在事件处理函数中取得触发源? [复制链接]

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

[ 本帖最后由 琳琳的小狗 于 2006-5-30 10:47 编辑 ]

论坛徽章:
0
发表于 2006-05-30 00:55 |显示全部楼层
最常用的方法:
event.GetId()  来得到出发来源的id,再根据这个id来找到这个item。
通过 定义一个范围, 比如说 来源是一个menuitem。
你可以这样(self为一个wx.Frame的实例):
self.GetMenuBar().FindItemById(event.GetId())    这样你就得到了这个触发事件的item。
还是以menu做例子, 你可以通过GetMenuItems()取得你这个menu里面所有menuitem的一个list。
再通过刚才的到的item,来找到它相邻的下一个item。

我也在学习wxpython。。以后多交流。

论坛徽章:
0
发表于 2006-05-30 10:11 |显示全部楼层
问题已解决。谢谢大家:)

通过在事件处理函数中使用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查找事件源,不过感觉这样多做了一步,还是上面的方法简洁^_^

[ 本帖最后由 琳琳的小狗 于 2006-5-30 10:17 编辑 ]

论坛徽章:
0
发表于 2006-05-30 11:25 |显示全部楼层
呵呵,,
我再补充一下。  如果你的Event是 wx.EVT_MENU 。
而你的触发源是 wx.MenuItem 的话 ( 这是在处理菜单时很常见的情况)
用 wx.EVT_MENU.GetEventObject()   得到的将不是MenuItem 而是 Menu。

除非你对每个MenuItem单独绑定 (没人会这么做吧)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP