2

有没有办法用单个 proc 禁用 tk 窗口中的所有小部件?参数可以只是初始顶级路径。

4

1 回答 1

6

给定一个小部件,您可以使用 [winfo children] 获取该小部件的所有子级。通过一个微小的递归过程,您可以对小部件树中的每个小部件进行操作。如果你想偷懒,通常也可以通过 [info commands.*] 获取所有小部件的列表。这通常足够好,除非您的应用程序创建名称以“.”开头的过程或图像。

大多数 tk 小部件接受“-state”选项,而那些不接受的通常可以忽略,因为状态无关紧要(例如,框架小部件)。因此,您可以遍历所有小部件并执行类似 [catch {$widget configure -state disabled}] 的操作。如果您有不寻常的小部件需要通过其他方式启用或禁用(例如具有“状态”子命令的 ttk 按钮),这将不起作用。

如果您有一个使用标准小部件的简单应用程序,那么这样的事情可能就足够了:

proc disable_all {path} {
    catch {$path configure -state disabled}
    foreach child [winfo children $path] {
        disable_all $child
    }
}

为了精确控制,您可以使用“[winfo class $widget]”来获取小部件的类,并根据类执行不同的命令。

于 2010-02-08T15:28:29.570 回答