Python tkinter - успешно наследуется от верхнего уровня
Я пытаюсь использовать объектно-ориентированный подход для создания класса, унаследованного от toplevel tkinter, который запускается нажатием кнопки в главном окне.
Текущий код вызывает AttributeError (объект "MakeWindow" не имеет атрибута "tk"). Может кто-то указать мне верное направление?
#! python3
import tkinter as tk
class Application:
def __init__(self, master):
self.frame = tk.Frame(master)
self.frame.pack()
self.okButton = tk.Button(self.frame, text="OK",
command=self.window_maker).pack()
self.quitButton = tk.Button(self.frame, text="Close",
command=self.frame.quit).pack()
def window_maker(self):
MakeWindow("A message to Toplevel")
class MakeWindow(tk.Toplevel):
def __init__(self, message):
super().__init__(self)
self.message = message
self.display = tk.Label(self, text=message)
self.display.pack()
if __name__ == '__main__':
root = tk.Tk()
app = Application(root)
root.mainloop()
Полный возврат:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\r\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 1550, in __call__
return self.func(*args)
File "C:/Users/r/PycharmProjects/tkinter_gui/y.py", line 15, in window_maker
MakeWindow("A message to Toplevel")
File "C:/Users/r/PycharmProjects/tkinter_gui/y.py", line 20, in __init__
super().__init__(self)
File "C:\Users\r\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 2182, in __init__
BaseWidget.__init__(self, master, 'toplevel', cnf, {}, extra)
File "C:\Users\r\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 2132, in __init__
BaseWidget._setup(self, master, cnf)
File "C:\Users\r\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 2110, in _setup
self.tk = master.tk
AttributeError: 'MakeWindow' object has no attribute 'tk'
1 ответ
Решение
Проблема заключается в super().__init__(self)
так должно быть super().__init__()
, Более того, не обязательно использовать super
в этом случае (см. Что делает "супер" в Python?). Следующий код работает:
import tkinter as tk
class Application:
def __init__(self, master):
self.frame = tk.Frame(master)
self.frame.pack()
self.okButton = tk.Button(self.frame, text="OK",
command=self.window_maker).pack()
self.quitButton = tk.Button(self.frame, text="Close",
command=self.frame.quit).pack()
def window_maker(self):
MakeWindow("A message to Toplevel")
class MakeWindow(tk.Toplevel):
def __init__(self, message):
tk.Toplevel.__init__(self) #instead of super
self.message = message
self.display = tk.Label(self, text=message)
self.display.pack()
if __name__ == '__main__':
root = tk.Tk()
app = Application(root)
root.mainloop()