如何在 tk 中使所有小部件状态为禁用?

发布于 2024-08-20 19:01:54 字数 46 浏览 3 评论 0原文

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

Is there way to disable all widget in tk window with single proc? argument can be just initial toplevel path.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

月下客 2024-08-27 19:01:54

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

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

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

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

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

Given a widget, you can get all of the children of that widget with [winfo children]. With a tiny recursive procedure you can act upon every widget in a tree of widgets. If you want to be lazy, you can usually also get a list of all widgets by doing [info commands .*]. That is often Good Enough, unless your application creates procedures or images with a name that begin with ".".

Most tk widgets accept a "-state" option, and those that don't can usually be ignored since state doesn't matter (for example, a frame widget). So, you can iterate over all the widgets and do something like [catch {$widget configure -state disabled}]. This won't work if you have unusual widgets that need to be enabled or disabled by some other means (such as the ttk button which has a "state" subcommand).

If you have a simple application using standard widgets, something like this may be Good Enough:

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

For precise control you can use "[winfo class $widget]" to get the class of the widget, and do different commands depending on the class.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文