wxPython:手动调用事件

22 投票
6 回答
29981 浏览
提问于 2025-04-15 11:07

我该如何在自己的代码中手动调用一个特定的事件呢?

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)

(wxWidgets文档wxPython文档)

这里的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的维基页面上找到,特别是关于长时间运行的任务。

撰写回答