2012-12-27 15 views
5

Próbuję utworzyć zakładki wxPython przy użyciu klasy Notebook. Korzystanie z samouczka umieszczonego powyżej, wpadłem na następujący kod:TypeError: Argument podany przez nazwę "id" i pozycję (2) - wxPython

#!/usr/bin/env python 

import wx 

class DeployTab(wx.Panel): 
    def __init__(self, parent, *args, **kwargs): 
     super(DeployTab, self).__init__(self, *args, parent=parent, id=wx.ID_ANY, **kwargs) 

     self.sizer = wx.Panel(self) 
     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     deploy = wx.Button(
      self.main_panel, 
      label="test 1", 
      size=(250, 100)) 
     self.sizer.Add(deploy, flag=wx.EXPAND|wx.ALL, border=5) 

     self.SetSizer(self.sizer) 

class ConfigTab(wx.Panel): 
    # For now, copy. 
    def __init__(self, parent, *args, **kwargs): 
     super(ConfigTab, self).__init__(self, *args, parent=parent, id=wx.ID_ANY, **kwargs) 

     self.sizer = wx.Panel(self) 
     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     deploy = wx.Button(
      self.main_panel, 
      label="test2", 
      size=(250, 100)) 
     self.sizer.Add(deploy, flag=wx.EXPAND|wx.ALL, border=5) 

     self.SetSizer(self.sizer) 

class NotebookTabs(wx.Notebook): 
    def __init__(self, parent): 
     super(NotebookTabs, self).__init__(self, parent, id=wx.ID_ANY, style=wx.BK_DEFAULT) 

     self.deploy_tab = DeployTab(self) 
     self.deploy_tab.SetBackgroundColor("Gray") 
     self.AddPage(self.main_tab, "Go!") 

     self.options_tab = ConfigTab(self) 
     self.AddPage(self.options_tab, "Options") 


class MainWindow(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     super(MainWindow, self).__init__(*args, **kwargs) 

     self.SetSize((300, 250)) 
     self.SetTitle('Testing') 
     self.Centre() 
     self.Show(True) 

     self.setup_sizers() 

    def setup_sizers(self): 
     self.panel = wx.Panel(self) 
     self.notebook = NotebookTabs(self.panel) 
     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.sizer.Add(self.notebook, 1, wx.ALL|wx.EXPAND, 5) 
     self.panel.SetSizer(self.sizer) 
     self.Layout() 

    def on_quit(self, event): 
     self.Close() 

def main(): 
    app = wx.App() 
    MainWindow(None) 
    app.MainLoop() 

if __name__ == '__main__': 
    main() 

daje następujący błąd:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "test.pyw", line 72, in main 
    MainWindow(None) 
    File "test.pyw", line 55, in __init__ 
    self.setup_sizers() 
    File "test.pyw", line 61, in setup_sizers 
    self.notebook = NotebookTabs(self.panel) 
    File "test.pyw", line 36, in __init__ 
    super(NotebookTabs, self).__init__(self, parent, id=wx.ID_ANY, style=wx.BK_DEFAULT) 
    File "C:\Python27\lib\site-packages\wx-2.8-msw-unicode\wx\_controls.py", line 3147, in __init__ 
    _controls_.Notebook_swiginit(self,_controls_.new_Notebook(*args, **kwargs)) 
TypeError: Argument given by name ('id') and position (2) 

Potem zmienił NotebookTabs do następujących (upraszczając nadklasy inicjalizacji):

class NotebookTabs(wx.Notebook): 
    def __init__(self, parent): 
     super(NotebookTabs, self).__init__(self, parent) 

     self.deploy_tab = DeployTab(self) 
     self.deploy_tab.SetBackgroundColor("Gray") 
     self.AddPage(self.main_tab, "Go!") 

     self.options_tab = ConfigTab(self) 
     self.AddPage(self.options_tab, "Options") 

... i dostał się następujący komunikat o błędzie:

File "<stdin>", line 1, in <module> 
    File "test.pyw", line 72, in main 
    MainWindow(None) 
    File "test.pyw", line 55, in __init__ 
    self.setup_sizers() 
    File "test.pyw", line 61, in setup_sizers 
    self.notebook = NotebookTabs(self.panel) 
    File "test.pyw", line 36, in __init__ 
    super(NotebookTabs, self).__init__(self, parent) 
    File "C:\Python27\lib\site-packages\wx-2.8-msw-unicode\wx\_controls.py", line 3147, in __init__ 
    _controls_.Notebook_swiginit(self,_controls_.new_Notebook(*args, **kwargs)) 
TypeError: in method 'new_Notebook', expected argument 1 of type 'wxWindows *' 

Czuję, że brakuje mi czegoś oczywistego, ale wydaje mi się, że nie jestem w stanie określić, co jest nie tak. Czy ktoś może mi pomóc w zidentyfikowaniu problemu?

Odpowiedz

4

Nie powinieneś zdać self do super(NotebookTabs, self).__init__, super dba o to:

super(NotebookTabs, self).__init__(parent) 

super(DeployTab, self).__init__(*args, parent=parent, id=wx.ID_ANY, **kwargs) 

super(ConfigTab, self).__init__(*args, parent=parent, id=wx.ID_ANY, **kwargs) 
2

Ten problem występuje, gdy przechodzą ten sam argument w obu argumentów pozycyjnych i kluczowe:

def foo(x=10, y=20): 
    ... 

args = [5] 
kwargs = { "x":15 } 
foo(*args, **kwargs) # x is passed twice 

Nie jestem zaznajomiony z wxPython, więc nie mogłem zidentyfikować dokładnie gdzie to się dzieje, ale jestem d sugeruje sprawdzenie kodu, w którym był używany *args i/lub **kwargs, ponieważ problem jest na pewno.

Aktualizacja: jak @Pavel Anossov podkreślił, problemem jest powielany wykorzystanie self:

super(NotebookTabs, self).__init__(self, parent, id=wx.ID_ANY, style=wx.BK_DEFAULT) 

Wywoływana w ten sposób, self będzie pierwszy parametr (parent) i parent będzie drugim (id). I podajesz także id jako argument słowa kluczowego, stąd błąd.

Powiązane problemy