【问题标题】:How to use super() when subclassing Tkinter widgets? [duplicate]子类化 Tkinter 小部件时如何使用 super()? [复制]
【发布时间】:2013-08-12 20:09:41
【问题描述】:

尝试使用super() 创建 Tkinter 窗口。 我收到此错误:

TypeError: super() argument 1 must be type, not classobj

代码:

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()

【问题讨论】:

    标签: python python-2.7 tkinter super


    【解决方案1】:

    虽然Tkinter 确实使用旧式类,但可以通过从object 额外派生子类Application 来克服此限制(使用Python 多重继承):

    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 类不尝试任何需要成为旧式类才能工作的行为(我非常怀疑它会),这将起作用。我使用 Python 2.7.7 测试了上面的示例,没有任何问题。

    建议here 解决此问题。默认情况下,此行为也包含在 Python 3 中(在链接中引用)。

    【讨论】:

      【解决方案2】:

      Tkinter 使用旧式类。 super() 只能与new-style classes 一起使用。

      【讨论】:

      • 那么我应该做的是这样做:tk.Frame.__init__(self, master) 而不是 super()?
      猜你喜欢
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      相关资源
      最近更新 更多