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

我觉得我遗漏了一些明显的东西,但我似乎无法确定出了什么问题。有人可以帮我找出问题吗?

4

2 回答 2

4

您不应该传递selfsuper(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)
于 2012-12-27T09:10:15.147 回答
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作为关键字参数传递,因此出现错误。

于 2012-12-27T09:06:56.443 回答