URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10439
[ Назад ]

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

Отправлено xintrea , 06-Апр-23 13:39 
В нижеприведенном коде есть создание переменной 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()


Содержание

Сообщения в этом обсуждении
"Tkinter - не пойму в какой момент виджет был размещен в окне"
Отправлено Eddhie , 11-Апр-23 12:56 
Наверное, отыскивает первый экземпляр 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()


"Tkinter - не пойму в какой момент виджет был размещен в окне"
Отправлено Брат Анон , 18-Апр-23 10:30 
1) Переменная var привязывается к cb, а не окну верхнего уровня.
2) Никакой прямой связи между root и app нет. структура примера -- неправильная. Объект Example -- не должен наследоваться от Frame (он должен его включать, ровно так же как и корневое окно).
3) Переменная var начинает работать как и всё остальное с момента вызова root.mainloop()