Python 获取Tkinter上的顶级级别列表

Python 获取Tkinter上的顶级级别列表,python,tkinter,toplevel,Python,Tkinter,Toplevel,我想知道是否有一种简单的方法可以从特定的窗口获取所有顶级,包括顶级中的顶级。在下面的代码中,我留下了一个我想做的示例: from tkinter import Tk, Toplevel v = Tk() v2 = Toplevel(v) v3 = Toplevel(v2) v4 = Toplevel(v2) def toplevels(ventana): print("Here I return the list of all toplevels, in case of choosi

我想知道是否有一种简单的方法可以从特定的窗口获取所有顶级,包括顶级中的顶级。在下面的代码中,我留下了一个我想做的示例:

from tkinter import Tk, Toplevel

v = Tk()
v2 = Toplevel(v)
v3 = Toplevel(v2)
v4 = Toplevel(v2)

def toplevels(ventana):
    print("Here I return the list of all toplevels, in case of choosing the main window, it should return:")
    print()
    print(".")
    print(".toplevel")
    print(".toplevel.toplevel")
    print(".toplevel.toplevel2")

toplevels(v)

Tkinter中是否内置了一些东西来实现这一点?

每个小部件都有其子部件的列表,使用递归可以获得所有小部件

from tkinter import Tk, Toplevel, Label

v = Tk()
v2 = Toplevel(v)
v3 = Toplevel(v2)
v4 = Toplevel(v2)
Label(v)
Label(v2)
Label(v3)
Label(v4)

def toplevels(ventana):
    for k, v in ventana.children.items():
        if isinstance(v, Toplevel):
            print('Toplevel:', k, v)
        else:
            print('   other:', k, v)
        toplevels(v)

toplevels(v)
结果

Toplevel: !toplevel .!toplevel
Toplevel: !toplevel .!toplevel.!toplevel
   other: !label .!toplevel.!toplevel.!label
Toplevel: !toplevel2 .!toplevel.!toplevel2
   other: !label .!toplevel.!toplevel2.!label
   other: !label .!toplevel.!label
   other: !label .!label

每个小部件都有其子部件的列表,使用递归可以获得所有小部件

from tkinter import Tk, Toplevel, Label

v = Tk()
v2 = Toplevel(v)
v3 = Toplevel(v2)
v4 = Toplevel(v2)
Label(v)
Label(v2)
Label(v3)
Label(v4)

def toplevels(ventana):
    for k, v in ventana.children.items():
        if isinstance(v, Toplevel):
            print('Toplevel:', k, v)
        else:
            print('   other:', k, v)
        toplevels(v)

toplevels(v)
结果

Toplevel: !toplevel .!toplevel
Toplevel: !toplevel .!toplevel.!toplevel
   other: !label .!toplevel.!toplevel.!label
Toplevel: !toplevel2 .!toplevel.!toplevel2
   other: !label .!toplevel.!toplevel2.!label
   other: !label .!toplevel.!label
   other: !label .!label

在开始时创建列表,并手动将每个顶层添加到此列表<代码>所有顶级。附加(v)我要找的函数是要放在一个模块中的,但我可能会把你的想法作为最后的手段。谢谢。每个小部件都有儿童小部件的列表,所以您可以获取此列表并检查每个儿童的类型。您必须使用递归来检查每个项中的每个子项。是的,但是您所说的函数(
winfo_children
)不会返回所有顶级,只返回与窗口关联的顶级。例如
v.winfo_children()
将只返回到
v2
,而不是
v3
v4
。关于递归,这就是我试图看到的。我想问的是是否有一种更简单的方法。在开始时创建列表,然后手动将每个顶层添加到此列表中<代码>所有顶级。附加(v)我要找的函数是要放在一个模块中的,但我可能会把你的想法作为最后的手段。谢谢。每个小部件都有儿童小部件的列表,所以您可以获取此列表并检查每个儿童的类型。您必须使用递归来检查每个项中的每个子项。是的,但是您所说的函数(
winfo_children
)不会返回所有顶级,只返回与窗口关联的顶级。例如
v.winfo_children()
将只返回到
v2
,而不是
v3
v4
。关于递归,这就是我试图看到的。我想问的是是否有一种更简单的方法。现在我明白了递归的真正含义。谢谢你的代码。现在我明白了递归的真正含义。谢谢你的密码。