Как получить корневое окно, в которое помещается виджет из этого виджета?

#python #tkinter #tk

#python #tkinter #tk-toolkit

Вопрос:

Я создаю графический интерфейс на основе Tkinter. Я создал пользовательский виджет кнопок, и я хотел бы получить доступ к корневому (главному) окну оттуда.

Я знаю об .master атрибуте, и я могу использовать его для достижения того, чего я хочу (см. Код ниже). Но поскольку кнопка может быть размещена очень глубоко внутри десятков фреймов, я должен получить .master рекурсивно, пока не получу None . Интересно, есть ли более чистый способ получить главное окно программы?

 import tkinter as tk


class MyButton(tk.Button):
    def __init__(self, *args, **kwargs):
        super().__init__(bg="white", *args, **kwargs)

        root_window = self.master
        while root_window.master:
            root_window = root_window.master
        assert isinstance(root_window, tk.Tk)

        # in my particular case, the above code is equivalent to this:
        assert isinstance(self.master.master.master.master, tk.Tk)

        # but I'd like to be able to use something like that:
        # assert isinstance(self.root_window, tk.Tk)

root = tk.Tk()
frame1 = tk.Frame(root)
frame2 = tk.Frame(frame1)
frame3 = tk.Frame(frame2)
my_btn = MyButton(frame3)

for widget in (frame1, frame2, frame3, my_btn):
    widget.pack()

root.mainloop()
  

Ответ №1:

Вызов winfo_toplevel любого виджета даст вам корневое окно этого виджета.