如何禁用父小部件中的所有用户输入小部件(按钮、条目......)?

zml*_*zml 5 python tk-toolkit tkinter

我正在使用 Python 和 Tkinter 设计 GUI。注册用户输入命令所需的所有按钮和条目都放置在主框架内,并且是它们的子窗口小部件。

我想知道是否可以通过将一些“禁用”标志从主框架传播到所有输入小部件来禁用这些小部件的所有输入功能。通过这种方式,我希望能够通过一行代码切换它们的状态。

我相信这应该是可能的。有谁知道如何做到这一点?

pat*_*yts 6

Tk 小部件有一个状态配置选项,可以是正常的禁用的winfo_children因此,您可以使用框架上的方法将框架的所有子项设置为禁用以迭代它们。例如:

for w in app.winfo_children():
    w.configure(state="disabled")
Run Code Online (Sandbox Code Playgroud)

Ttk 小部件具有可能需要替代处理的状态方法。您可能还想将takefocus选项设置为 False,尽管我认为移动焦点时会自动跳过禁用的小部件(例如:通过按 Tab 键)。

编辑

例如,如果需要访问子框架中包含的小部件,您可以使用winfo_childrenwinfo_parent方法在两个方向上遍历小部件树。例如,一个访问根小部件的每个子部件的简单函数:

def visit_widgets(root, visitor):
  visitor(root)
  for child in root.winfo_children():
    visit_widgets(child, visitor)

from __future__ import print_function
visit_widgets(app, lambda w: print(str(w)))
Run Code Online (Sandbox Code Playgroud)