我不知道为什么错误显示它有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)
答案 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')
创建新对象时,我们只会使用一个强>论证。
构造函数需要两个参数,但第一个参数将是要创建的对象的实例。传递的其余参数将是调用构造函数时传递的任何内容。
因此,在您的情况下,Page1
和Page2
类的__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)
是相同的,以便程序运行。
否则,它将不会运行或给出有关参数的错误。