Старая тема, но я думаю, что я понял это после того, как запутался в ней в течение длительного времени, поэтому, если кто-нибудь еще придет сюда в поисках ответа, это может помочь.
Чтобы вручную опубликовать событие, вы можете использовать
self.GetEventHandler().ProcessEvent(event)
(wxWidgets документы здесь , wxPython документы здесь )
или
wx.PostEvent(self.GetEventHandler(), event)
( wxWidgets docs , wxPython docs )
, где 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
и т.д.
Надеюсь, это кому-нибудь пригодится.