LINUX.ORG.RU

Tkinter - не пойму в какой момент виджет был размещен в окне

 ,


0

1

В нижеприведенном коде есть создание переменной 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()

★★★★★

Последнее исправление: Xintrea (всего исправлений: 2)
Ответ на: комментарий от Zeta_Gundam

Чтобы не запутаться, я так переписал:

class Example(Frame):
    def __init__(self, window):
        super().__init__(window)
        self.initUI()
...
app = Example(root)


Пример работает, но не знаю, правильно ли я сделал.

Xintrea ★★★★★
() автор топика

root - toplevel окно с путём «.» (точка). Оно размещается (отображается) прямо сразу

фрейм имеет путь «.некая_хрень» и self.pack(fill=BOTH, expand=True) его размещает в окне. Используется менеджер pack

дальше чек буттон c путём «.некая_хрень.чтото» вызовом cb.place(x=50, y=50) размещается внутри фрейма. Используется менеджер place

какие пути авто-генерит tkinter не знаю, просто вышесказанное очевидно.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

toplevel окно с путём «.» (точка)
фрейм имеет путь «.некая_хрень»

Что имеется в виду под термином «путь»? Это файловый путь? Это путь в объектной системе? Это путь в объектной системе в каком-то namespace? Что это?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Что имеется в виду под термином «путь»? Это файловый путь? Это путь в объектной системе? Это путь в объектной системе в каком-то namespace? Что это?

иерархический путь виджета в оконной системе Tk. Внутренне - имя команды tcl

если переложить на родной для tk tcl, то у вас получается

wm geometry . 250x150+300+300
labelframe .f1 -text "флажки"
pack .f1 -fill both -expand true
checkbutton .f1.c1 -text "показать заголово" -command {..}
place .f1.c1 -x 50 -y 50

имена/пути .f1 .f1.c1 назначились «под капотом» python tkinter и создалась одноименная им процедура отвечающая за виджет.

см. https://tkdocs.com/tutorial/index.html

MKuznetsov ★★★★★
()