TypeError:由名称“id”和位置(2)wxPython给出的参数

2024-10-01 15:40:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用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()

它给出以下错误:

^{pr2}$

然后,我将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 *'

我觉得我遗漏了一些显而易见的东西,但我似乎无法识别出什么地方出了问题。谁能帮我找出问题所在吗?在


Tags: inselfinitmaindefargstabkwargs
2条回答

您不应该将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)

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

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

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

我不熟悉wxPython,所以我不能确定这是在哪里发生的,但是我建议检查您的代码在哪里使用了*args和/或{},因为问题肯定存在。在

更新:正如@Pavel anosov指出的,问题在于重复使用self

^{pr2}$

{{{cd5>,第二个{cd5}将被称为id作为关键字参数传递,因此出现错误。在

相关问题 更多 >

    热门问题