如何列出 Tcl/Tk 中的所有顶层,包括通过 wm 管理创建的顶层?

How can I list all toplevels in Tcl/Tk, including those created via wm manage?

我最近发现了非常有用的 wm manage 命令,它可以在层次结构中的任何位置获取现有的 tk 框架,并将其提升为新的顶层小部件。它对于撕掉现有的单个 window 应用程序和制作独立的工具面板等很有用。

我现在发现自己想要列出应用程序中的所有顶层,因为现在比原来的主层多很多 window。

winfo children . 的结果给出了作为根 window 子级的所有顶层,但是所有被撕掉的顶层都保留了它们在层次结构中的路径,因此没有列出。是否有另一种方法可以列出所有 tk window 顶级名称,这些名称将包括这些被撕掉的框架?

您可以遍历所有小部件层次结构并收集 [winfo toplevel] 等于小部件本身的小部件,如以下过程:

proc toplevels {{w .}} {
    if {[winfo toplevel $w] eq $w} {
        set res [list $w]
    } else {
        set res {}
    }
    foreach ww [winfo children $w] {
        lappend res {*}[toplevels $ww]
    }
    return $res
}

如果您只需要当前显示在屏幕上的顶层,wm stackorder . 命令就可以了。