关于tkinter:Python 2.7 super()错误

Python 2.7 super() error

本问题已经有最佳答案,请猛点这里访问。

正在尝试使用super()创建tkinter窗口。我得到这个错误:

super(应用程序,自身)。初始化(master)类型错误:必须是类型,而不是ClassObj

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import Tkinter as tk

class Application(tk.Frame):

    def __init__(self, master):
        super(Application, self).__init__(master)
        self.grid()


def main():
    root = tk.Tk()
    root.geometry('200x150')
    app = Application(root)

    root.mainloop()


main()


虽然Tkinter使用旧样式类是正确的,但是可以通过从object额外派生子类Application来克服这个限制(使用python多重继承):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import Tkinter as tk

class Application(tk.Frame, object):

    def __init__(self, master):
        super(Application, self).__init__(master)
        self.grid()

def main():
    root = tk.Tk()
    root.geometry('200x150')
    app = Application(root)

    root.mainloop()

main()

只要tkinter类不尝试任何需要成为旧样式类才能工作的行为(我强烈怀疑这一点),这就可以工作。我用Python2.7.7测试了上面的示例,没有任何问题。

这里建议进行这项工作。这种行为默认情况下也包括在Python3中(在链接中引用)。


Tkinter使用旧式类。super()只能用于新样式的类。