В нижеприведенном коде есть создание переменной app. Она является экземпляром класса Example, который в свою очередь является расширением от класса Frame.Так вот, я не пойму в какой момент эта переменная привязывается к окну root, чтобы работать внутри него. Никакой связи между root и app я не наблюдаю. Но тем не менее пример работает.
Как это происходит? Сам код:
from tkinter import Tk, Frame, Checkbutton
from tkinter import BooleanVar, BOTH
class Example(Frame):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.master.title("Флажки")
self.pack(fill=BOTH, expand=True)
self.var = BooleanVar()
cb = Checkbutton(self, text="Показать заголовок", variable=self.var, command=self.onClick)
cb.select()
cb.place(x=50, y=50)
def onClick(self):
if self.var.get():
self.master.title("Флажки")
else:
self.master.title("")
def main():
root = Tk()
root.geometry("250x150+300+300")
app = Example()
root.mainloop()
if __name__ == '__main__':
main()
Наверное, отыскивает первый экземпляр Tk(), который считается главным. Можно уточнить это, передав в конструктор явно, тогда станет возможным манипулировать с root прямо в классе Example:
class Example(Frame):
def __init__(self, root):
super().__init__(root)
root.geometry("250x150+300+300")
self.initUI()def main():
root = Tk()
app = Example(root)
root.mainloop()
1) Переменная var привязывается к cb, а не окну верхнего уровня.
2) Никакой прямой связи между root и app нет. структура примера -- неправильная. Объект Example -- не должен наследоваться от Frame (он должен его включать, ровно так же как и корневое окно).
3) Переменная var начинает работать как и всё остальное с момента вызова root.mainloop()