Вы определяете свой класс как
class test_GUI(tk.Frame):
, поэтому ваш класс наследует от tk.Frame
, что означает, что ваш класс в основном является фреймом с дополнительными функциями.
Когда вы делаете
super().__init__(master)
Вы инициализируете класс, от которого наследуетесь, то есть tk.Frame
.В настоящее время нет объекта tk.Tk
(и master=None
).Поскольку фрейм (или любой другой виджет tkinter) не может существовать без экземпляра tk.Tk
, tkinter автоматически создаст его для вас.Это ваше первое окно.
После этого вы вызываете
self._window = tk.Tk()
, чтобы сделать tk.Tk
экземпляр самостоятельно.Это ваше второе окно.Кроме того, что вам не нужны два окна, вы никогда не должны запускать более одного экземпляра tk.Tk
(или, точнее, связанного интерпретатора Tcl) одновременно, потому что это приводит к неожиданному поведению.
Итаккак вы можете это исправить?
У вас в основном есть два варианта: удалить наследование или инициировать tk.Tk
перед инициацией вашего класса.
Без наследования ваше приложение может быть структурировано как
import tkinter as tk
class test_GUI():
def __init__(self):
self._window=tk.Tk()
self._window.title("The window I initzialized")
self.button = tk.Button(self._window, text='Test button')
self.button.pack()
...
self._window.mainloop()
С наследованием вы можете сделать это следующим образом
import tkinter as tk
class test_GUI(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.master.title("The window I initzialized")
self.button = tk.Button(self, text='Test button')
self.button.pack()
root = tk.Tk()
app=test_GUI(root)
app.pack(fill='both', expand=True)
root.mainloop()
Оба способа работают нормально.Мне лично нравится версия с наследованием.Также ознакомьтесь с публикацией Брайана Оукли о структурировании приложения tkinter здесь .