我正在尝试使用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 *'
我觉得我错过了一些明显的东西,但我似乎无法辨别出什么是错的。有人可以帮我找出问题吗?
答案 0 :(得分: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)
答案 1 :(得分: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
作为关键字参数传递,因此错误。