TypeError:__ init __()只需2个参数(给定3个)

时间:2015-05-04 16:35:20

标签: python python-2.7 tkinter ttk

我不知道为什么错误显示它有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)

2 个答案:

答案 0 :(得分: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__方法带有两个参数,这意味着您需要使用< strong>一个参数,因为第一个参数自动是相应类的新实例。

答案 1 :(得分: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)。更重要的是,每个页面的第3行中的(self,parent)是相同的,以便程序运行。

否则,它将不会运行或给出有关参数的错误。