在wxPython中生成自定义CommandEvent

时间:2009-03-12 19:05:33

标签: wxpython

我的顶级窗口需要知道自定义控件的内部状态何时更改,以便它可以更新GUI的各个其他部分。如何在控件中生成自定义事件,以便它可以传播并由顶级窗口处理?

2 个答案:

答案 0 :(得分:12)

我知道这是一个老问题,但是在wxPython中有更新,更好的方法。从http://wiki.wxpython.org/CustomEventClasses及以上内容转述:

定义事件:

import wx.lib.newevent
QuantityChangedEvent, EVT_QUANTITY_CHANGED = wx.lib.newevent.NewCommandEvent()

生成活动:

event = QuantityChangedEvent(self.GetId())
self.GetEventHandler().ProcessEvent(event)
# or ...
#wx.PostEvent(self, event)

绑定事件保持不变。

答案 1 :(得分:11)

为了传播,事件必须是wx.CommandEvent。 (有关传播的详细信息,请参阅wxWidgets event handling overview。)更具体地说,它应该是wx.PyCommandEvent,它具有Python感知能力并能够通过wxWidgets事件系统安全地传输其Python位并让它们保持静止在调用事件处理程序时就在那里。

按如下方式定义自定义事件类型:

EVT_QUANTITY_CHANGED = wx.PyEventBinder(wx.NewEventType(), 1)

您可能希望在模块级别执行此操作,但在某些情况下可能需要在控件的__init__方法中执行此操作。

控件现在可以生成如下事件:

event = wx.PyCommandEvent(EVT_QUANTITY_CHANGED.typeId, self.GetId())
self.GetEventHandler().ProcessEvent(event)

顶级窗口可以通常的方式绑定和处理事件:

self.Bind(mycontrol.EVT_QUANTITY_CHANGED, self.OnQuantityChanged)