2015-05-04 165 views
1

我不知道为什么错误显示它有3个参数。任何人都可以帮忙TypeError:__init __()需要2个参数(给出3个)

Traceback: 
    line 23, in __init__ 
    frame = F(self, container) 
TypeError: __init__() takes exactly 2 arguments (3 given) 

代码:

class CGPACalculator(Tkinter.Tk): 
    def __init__(self, *args, **kwargs): 
     Tkinter.Tk.__init__(self, *args, **kwargs) 
     container = Tkinter.Frame(self) 

     container.pack(side="top", fill="both", expand=True) 

     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 

     for F in (Page1, Page2): 
      frame = F(self, container) 

      self.frames[F] = frame 

      frame.grid(row=0, column=0, sticky="nsew") 

     self.show_frame(Page1) 
+1

'F(容器)'...你应该真的去阅读一些有关python类的教程... self总是隐式地传递给instanciated类方法 –

+0

但是在我删除“self”后,GUI没有出来。 –

+1

@JoranBeasley:或'F(self)'如果'self'是父母。 –

回答

1

@fhdrsdg指出其中添加的所有类应该有这样的定义相同的答案:

class Page1(Tkinter.Frame): 
    def __init__(self, parent, controller): 
     Tkinter.Frame.__init__(self, parent) 


class Page2(Tkinter.Frame): 
    def __init__(self, parent, controller): 
     Tkinter.Frame.__init__(self, parent) 

等等...

你可以看到所有的页面类有相同的升序(self, parent, controller)。更重要的是,每个页面的第三行中的(self,parent)都是相同的,以便程序运行。

否则,它不会运行或提供有关参数的错误。

1

简单的说,当你调用F(self, container)构造函数,你逝去的参数的构造函数,但是Python还包括新创建的对象,因为它是第一个参数这就是为什么它告诉你三个的论点。

请看下面的例子:

class Foo(object): 
    def __init__(self, bar): 
     self.bar = bar 

foobar = Foo('bar') 
print(foobar.bar) 

这创建Foo类型的一个新对象,并打印bar的新对象的值。下面是输出:

bar 

注意如何__init__方法都被定义为参数,但Foo('bar')创建新对象时,我们只一个参数调用它。

该构造函数需要两个参数,但第一个将是要创建的对象的实例。传递的其余参数将是调用构造函数时传递的参数。

所以你的情况,该Page1Page2类有一个__init__法参数,这意味着你需要一个参数来调用它,因为第一个自动为各自的新实例类。

相关问题