Имея виджет, вы можете получить всех потомков этого виджета с помощью [winfo children]. С помощью крошечной рекурсивной процедуры вы можете воздействовать на каждый виджет в дереве виджетов. Если вы хотите быть ленивым, вы также можете получить список всех виджетов, выполнив [info команды. *]. Часто этого достаточно, если ваше приложение не создает процедуры или изображения с именем, начинающимся с ".".
Большинство виджетов tk принимают опцию "-state", и те, которые не могут, обычно игнорируются, поскольку состояние не имеет значения (например, виджет кадра) Таким образом, вы можете перебрать все виджеты и сделать что-то вроде [catch {$ widget configure -state disabled}]. Это не будет работать, если у вас есть необычные виджеты, которые нужно включить или отключить другими способами (например, кнопкой ttk, которая имеет подкоманду «state»).
Если у вас простое приложение, использующее стандартные виджеты, что-то вроде этого может быть достаточно хорошо:
proc disable_all {path} {
catch {$path configure -state disabled}
foreach child [winfo children $path] {
disable_all $child
}
}
Для точного управления вы можете использовать «[winfo class $ widget]», чтобы получить класс виджета, и выполнять различные команды в зависимости от класса.