Ниже приведено одно из двух исключений.Пользовательские исключения для исключения NewCommandEvent
wx.PostEvent(self, MyEvent())
Вызов в методе MyPanel.OnButton
выбросит либо:
TypeError: __init__() takes exactly 2 arguments (1 given)
Если я вызываю код, вставленный без каких-либо аргументов.TypeError: in method 'new_PyCommandEvent', expected argument 2 of type 'int'
, если я передаю любое нецелое значение в конструктор MyEvent().
Старое, сломанное сообщение в форуме, которое я нашел, предложил мне передать идентификатор объекта любого объекта, предположительно инициирующего событие. Я могу сделать это с помощью:
wx.PostEvent(self, MyEvent(e.EventObject.GetId()))
й, который работает. Но,
- Каждый другой пример, который я могу найти в Интернете, не содержит аргументов для вновь созданного события, поэтому я предполагаю, что я что-то пропускаю.
- Я не уверен, что целое число, которое я получаю от GetId(), верно ... похоже, что идентификаторы могут быть необязательными?
-
import wx
import wx.lib.newevent
# Custom Events
MyEvent, EVT_MYEVENT = wx.lib.newevent.NewCommandEvent()
class MyPanel(wx.Panel):
def __init__(self, parent):
super(MyPanel, self).__init__(parent)
sizer = wx.BoxSizer()
self.button1 = wx.Button(self, label="Button 1")
sizer.Add(self.button1)
self.Bind(wx.EVT_BUTTON, self.OnButton)
def OnButton(self, e):
e.Skip()
##
# only works if I throw in an Int in the constructor but most
# of the tutorials don't do this.
wx.PostEvent(self, MyEvent())
class MyFrame(wx.Frame):
def __init__(self, parent, title=""):
super(MyFrame, self).__init__(parent, title=title)
self.panel = MyPanel(self)
class MyApp(wx.App):
def OnInit(self):
self.frame = MyFrame(None, title="Event Propagation")
self.frame.Show()
self.Bind(EVT_MYEVENT, self.OnMyEvt)
return True
def OnMyEvt(self, e):
print("MY EVENT HAS HAPPENED!")
e.Skip()
if __name__ == "__main__":
app = MyApp()
app.MainLoop()
Потенциально. Я собираюсь с учебником, и они использовали командное событие. Однако может быть опечатка. Я дам вам предложение выстрелить завтра. –