我的顶级窗口需要知道自定义控件的内部状态何时发生变化,以便它可以更新 GUI 的各个其他部分。如何在控件中生成自定义事件,以便它可以传播并由顶级窗口处理?
Vebjorn Ljosa
问问题
4110 次
2 回答
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)
绑定事件保持不变。
于 2010-09-07T13:40:15.040 回答
11
为了传播,事件必须是wx.CommandEvent。(有关传播的详细信息,请参阅wxWidgets 事件处理概述。)更具体地说,它应该是一个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)
于 2009-03-12T19:05:50.700 回答