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

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)
于 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れると、最初のパラメーター(parentparentになり、2番目のパラメーター()になりますid。またid、キーワード引数として渡しているため、エラーが発生します。

于 2012-12-27T09:06:56.443 に答える