super () в приложении tkinter - PullRequest
0 голосов
/ 02 июля 2019

У меня проблемы с пониманием этой ошибки.

В приведенном ниже коде, когда я использую tk.Frame, все работает, как задумано.Однако, если я использую super(), я получаю AttributeError (' Объект приложения не имеет атрибута tk ').

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__, ограниченный классом, за которым следует child в MRO экземпляра, то есть класс tkinter.Frame в моей ситуации.

Я подтвердил это, распечатав Application.__mro__ и проверив.

Так что мой вопрос, ссылаются ли оба super().__init__(self,parent) и tk.Frame.__init__(self,parent) на один и тот же __init__ метод класса tkinter.Frameпочему один выдает ошибку, а другой работает нормально?Я подозреваю, что у меня есть какое-то недопонимание, как работает super ().

1 Ответ

2 голосов
/ 02 июля 2019

Python 3 super не требует передачи self в качестве аргумента.

В следующем примере показан правильный способ вызова super для инициализации родительского класса виджета:

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.
подробнее

...