wxPython:手动调用事件

Ram*_*hum 20 python events user-interface wxpython

如何从我自己的代码手动调用特定事件?

Dav*_*vid 56

老话题,但我想我已经弄好了很长一段时间后弄清楚它,所以如果有其他人来这里寻找答案,这可能会有所帮助.

要手动发布活动,您可以使用

self.GetEventHandler().ProcessEvent(event)
Run Code Online (Sandbox Code Playgroud)

(wxWidgets文档在这里,wxPython文档在这里)

要么

wx.PostEvent(self.GetEventHandler(), event)
Run Code Online (Sandbox Code Playgroud)

(wxWidgets docs,wxPython docs)

event您要发布的活动在哪里?用例如构建事件

wx.PyCommandEvent(wx.EVT_BUTTON.typeId, self.GetId())
Run Code Online (Sandbox Code Playgroud)

如果你想发布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
Run Code Online (Sandbox Code Playgroud)

(我想我在某个地方的邮件列表存档中找到了这个代码,但我似乎无法再找到它.如果这是你的例子,谢谢!请添加评论并为此获得赞誉!)

现在,发布一个自定义事件:

event = MyEvent(myEVT_CUSTOM, self.GetId())
event.SetMyVal('here is some custom data')
self.GetEventHandler().ProcessEvent(event)
Run Code Online (Sandbox Code Playgroud)

你可以像任何其他事件一样绑定它

self.Bind(EVT_CUSTOM, self.on_event)
Run Code Online (Sandbox Code Playgroud)

并在事件处理程序中获取自定义数据

def on_event(self, e):
    data = e.GetMyVal()
    print 'custom data is: {0}'.format(data)
Run Code Online (Sandbox Code Playgroud)

或者在事件构造函数中包含自定义数据并保存一个步骤:

class MyEvent(wx.PyCommandEvent):
    def __init__(self, evtType, id, val = None):
        wx.PyCommandEvent.__init__(self, evtType, id)
        self.myVal = val
Run Code Online (Sandbox Code Playgroud)

等等

希望这对某人有帮助.


Joh*_*ery 10

我想你想要wx.PostEvent.

还有一些关于在wxPython wiki上发布来自其他线程的事件以获取长时间运行任务的信息.


Dan*_*ski 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)
Run Code Online (Sandbox Code Playgroud)