从tkinter对象继承时的参数错误

时间:2017-04-18 17:16:40

标签: python class inheritance tkinter

我有一个班级,称之为Test,其中有一个变量var。它在__init__ mathod中使用此变量,可能看起来像这样:

class Test(object):
    var = 0
    def __init__(self):
        print(self.var)

为了在初始化类之前更改此变量,这似乎是合乎逻辑的

test = Test
test.var = 42
test.__init__(test)

......并且表现得像我预期的那样。 (打印42
但是,当代码看起来像这样:

class Test(Canvas):
    var = 0
    def __init__(self, parent):
        Canvas.__init__(self, parent)
        self.pack()
        print(self.var)

test = Test
test.var = 42
test.__init__(test, frame) #tkinter frame I had made elsewhere

...它在canvas.__init__行引发错误,抱怨

TypeError: _options() missing 1 required positional argument: 'cnf'

我怀疑这是cnf参数的一个问题,因为这个类在“正常”调用时工作正常,就像在test = Test()中一样。我感觉参数的传递方式不同。 有人可以解释一下吗? 提前致谢

1 个答案:

答案 0 :(得分:1)

您似乎对python类的工作方式存在误解。

在您的代码中,您正在执行test = Test,除了让test指向班级Test之外什么也不做。它创建Test的实例。

如果要更改类值的值,则无需先对临时变量进行赋值。例如。要创建一个var设置为零的类,然后您想将其更改为42,您可以这样做:

class Test(object):
    var = 0
...
Test.var = 42

此外,除非在使用子类的__init__调用超类的函数时,否则不应直接调用__init__。相反,您创建了一个类的实例,它将自动为您调用__init__

test = Test()

无论是从tkinter类还是从任何其他类继承,这都是一样的。

运行以下示例时,它将打印出42

import tkinter as tk

class Test(tk.Canvas):
    var = 0
    def __init__(self, parent):
        tk.Canvas.__init__(self, parent)
        self.pack()
        print(self.var)

Test.var = 42

root = tk.Tk()
test = Test(root)

请注意,因为这是一个类变量,所以更改它一次将为所有实例更改它。