Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从小部件获取放置小部件的根窗口?_Python_Tkinter_Tk - Fatal编程技术网

Python 如何从小部件获取放置小部件的根窗口?

Python 如何从小部件获取放置小部件的根窗口?,python,tkinter,tk,Python,Tkinter,Tk,我正在创建一个基于Tkinter的GUI。我创建了一个自定义按钮小部件,我想从那里访问根(主)窗口 我知道.master属性,我可以使用它来实现我想要的(参见下面的代码)。但是因为按钮可能被放置在几十个帧的深处,所以我必须递归地获取.master,直到获得无。我想知道是否有一个更干净的方法来获取程序的主窗口 import tkinter as tk class MyButton(tk.Button): def __init__(self, *args, **kwargs):

我正在创建一个基于Tkinter的GUI。我创建了一个自定义按钮小部件,我想从那里访问根(主)窗口

我知道
.master
属性,我可以使用它来实现我想要的(参见下面的代码)。但是因为按钮可能被放置在几十个帧的深处,所以我必须递归地获取.master,直到获得
。我想知道是否有一个更干净的方法来获取程序的主窗口

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()

在任何小部件上调用
winfo_toplevel
,都会得到该小部件的根窗口