首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >超级()在tkinter中的应用

超级()在tkinter中的应用
EN

Stack Overflow用户
提问于 2019-07-02 04:48:03
回答 1查看 3.5K关注 0票数 4

我很难理解这个错误。

在下面的代码中,当我使用tk.Frame时,一切都按预期工作。但是,如果我使用super(),就会引发一个AttributeError ('Application没有属性tk')。

代码语言:javascript
复制
class Application(tk.Frame):
   def __init__(self,parent):
       tk.Frame.__init__(self,parent) <----- This works
       # super().__init__(self,parent) <------ This line throws an error
.
.
.

if __name__=='main':
  root=tk.Tk()
  Application(root).pack()
  root.mainloop()

我的理解是,super(Application,self).__init__()将调用绑定到类的__init__方法,该方法在实例的MRO中紧跟在child之后,即在我的情况下的类tkinter.Frame

我通过打印出Application.__mro__和检查来验证这一点。

所以我的问题是,如果super().__init__(self,parent)tk.Frame.__init__(self,parent)都是指类tkinter.Frame的相同的__init__方法,为什么其中一个抛出错误而另一个运行良好?我怀疑我在super()的工作方式上有一些误解。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-02 04:56:55

Python3 super不需要将self作为参数传递。

下面的示例说明了调用super来初始化小部件的父类的正确方法:

代码语言:javascript
复制
import tkinter as tk 


class Application(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        tk.Button(self, text='Super!', command=root.destroy).pack()


root = tk.Tk()
Application(root).pack()
root.mainloop()

原因是python核心开发人员决定简化super的使用,并将self的传递抽象为驱动python的底层代码。

more info

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56845491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档