2016-08-16 3 views
0

Ниже приведено одно из двух исключений.Пользовательские исключения для исключения NewCommandEvent

wx.PostEvent(self, MyEvent()) Вызов в методе MyPanel.OnButton выбросит либо:

  1. TypeError: __init__() takes exactly 2 arguments (1 given) Если я вызываю код, вставленный без каких-либо аргументов.
  2. TypeError: in method 'new_PyCommandEvent', expected argument 2 of type 'int', если я передаю любое нецелое значение в конструктор MyEvent().

Старое, сломанное сообщение в форуме, которое я нашел, предложил мне передать идентификатор объекта любого объекта, предположительно инициирующего событие. Я могу сделать это с помощью:

wx.PostEvent(self, MyEvent(e.EventObject.GetId()))

й, который работает. Но,

  1. Каждый другой пример, который я могу найти в Интернете, не содержит аргументов для вновь созданного события, поэтому я предполагаю, что я что-то пропускаю.
  2. Я не уверен, что целое число, которое я получаю от 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() 

ответ

0

Я подозреваю, что вы не требуют Command Event и что нормальное событие будет делать.
Изменение:

MyEvent, EVT_MYEVENT = wx.lib.newevent.NewCommandEvent() 

к:

MyEvent, EVT_MYEVENT = wx.lib.newevent.NewEvent() 

Он должен работать, как вы хотите.

Если вам требуется command event вам нужно, чтобы обеспечить id
Быстро насмешливый свой код (возможно, потребуется дальнейшая работа):

import wx 
import wx.lib.newevent 

# Custom Events 

MyEvent, EVT_MYEVENT = wx.lib.newevent.NewCommandEvent() 
CMD_ID = wx.NewId() 
class MyPanel(wx.Panel): 
    def __init__(self, parent): 
     super(MyPanel, self).__init__(parent) 
     sizer = wx.BoxSizer() 
     self.button1 = wx.Button(self, CMD_ID, label="Button 1") 
     sizer.Add(self.button1) 
     self.Bind(wx.EVT_BUTTON, self.OnButton,id=CMD_ID) 

    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. 
     id = e.GetId() 
     wx.PostEvent(self, MyEvent(id,myid=id)) 


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() 
+0

Потенциально. Я собираюсь с учебником, и они использовали командное событие. Однако может быть опечатка. Я дам вам предложение выстрелить завтра. –