类型错误:按名称“id”和位置(2)给出的参数--wxPython。

6

我正在尝试使用Notebook类在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()

它会显示以下错误:
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)

然后我将NotebookTabs更改为以下内容(简化超类初始化):

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")

...并收到了以下错误信息:

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 *'

我感觉好像漏了什么很明显的东西,但似乎无法确定问题出在哪里。有人可以帮我识别问题吗?

2个回答

4

你不应该将self传递给super(NotebookTabs, self).__init__super会自动处理:

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)

3

当您在位置参数和关键字参数中同时传递相同的参数时,就会出现此问题:

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

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

我不熟悉wxPython,因此无法确定出现问题的确切位置,但我建议检查您使用*args和/或**kwargs的代码,因为问题肯定出在这里。
更新:正如@Pavel Anossov所指出的,问题是重复使用了self
super(NotebookTabs, self).__init__(self, parent, id=wx.ID_ANY, style=wx.BK_DEFAULT)

这样调用时,self将是第一个参数(parent),parent将是第二个参数(id)。由于您还将id作为关键字参数传递,因此会出现错误。


你是第一个解释这个错误原因的人。谢谢! - Georg W.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接