The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]



"Tkinter - не пойму в какой момент виджет был размещен в окне"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Tcl/Tk)
Изначальное сообщение [ Отслеживать ]

"Tkinter - не пойму в какой момент виджет был размещен в окне"  +/
Сообщение от xintrea (ok), 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()

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


1. "Tkinter - не пойму в какой момент виджет был размещен в окне"  +/
Сообщение от Eddhie (ok), 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()

Ответить | Правка | Наверх | Cообщить модератору

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

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру