wxPython:手动调用事件
我该如何在自己的代码中手动调用一个特定的事件呢?
6 个回答
5
最近版本的wxPython有一种简单直接的方法可以做到这一点(可以参考这个链接:http://wiki.wxpython.org/CustomEventClasses):
# create event class
import wx.lib.newevent
SomeNewEvent, EVT_SOME_NEW_EVENT = wx.lib.newevent.NewEvent()
# post it, with arbitrary data attached
wx.PostEvent(target, SomeNewEvent(attr1=foo, attr2=bar))
# bind it as usual
target.Bind(EVT_SOME_NEW_EVENT, target.handler)
57
这是一个老话题,但我觉得我终于搞明白了,之前一直很困惑。如果有其他人也在这里寻找答案,希望这些内容能帮到你。
要手动发布一个事件,你可以使用
self.GetEventHandler().ProcessEvent(event)
(wxWidgets文档可以在这里找到,wxPython文档可以在这里找到)
或者
wx.PostEvent(self.GetEventHandler(), event)
这里的event
就是你想要发布的事件。你可以用例如下面的方式构造这个事件:
wx.PyCommandEvent(wx.EVT_BUTTON.typeId, self.GetId())
如果你想发布一个按钮点击事件(EVT_BUTTON)。将它设置为PyCommandEvent意味着这个事件会向上传播;其他类型的事件默认不会传播。
你还可以创建自定义事件,可以携带你想要的数据。这里有个例子:
myEVT_CUSTOM = wx.NewEventType()
EVT_CUSTOM = wx.PyEventBinder(myEVT_CUSTOM, 1)
class MyEvent(wx.PyCommandEvent):
def __init__(self, evtType, id):
wx.PyCommandEvent.__init__(self, evtType, id)
myVal = None
def SetMyVal(self, val):
self.myVal = val
def GetMyVal(self):
return self.myVal
(我记得这个代码是从某个邮件列表的存档里找到的,但现在找不到了。如果这是你的例子,感谢你!请留言并为此归功于你自己!)
现在,发布一个自定义事件的方法是:
event = MyEvent(myEVT_CUSTOM, self.GetId())
event.SetMyVal('here is some custom data')
self.GetEventHandler().ProcessEvent(event)
你可以像处理其他事件一样绑定它
self.Bind(EVT_CUSTOM, self.on_event)
并在事件处理程序中获取自定义数据
def on_event(self, e):
data = e.GetMyVal()
print 'custom data is: {0}'.format(data)
或者在事件构造函数中直接包含自定义数据,这样可以省去一步:
class MyEvent(wx.PyCommandEvent):
def __init__(self, evtType, id, val = None):
wx.PyCommandEvent.__init__(self, evtType, id)
self.myVal = val
等等。
希望这些内容对某些人有帮助。
12
我觉得你想要的是 wx.PostEvent。
另外,关于从其他线程发送事件的信息,可以在 wxPython的维基页面上找到,特别是关于长时间运行的任务。