Как сделать так, чтобы все виджеты были отключены в ТК? - PullRequest
2 голосов
/ 08 февраля 2010

Есть ли способ отключить все виджеты в окне tk с помощью одного процесса? Аргументом может быть просто начальный путь верхнего уровня.

1 Ответ

5 голосов
/ 08 февраля 2010

Имея виджет, вы можете получить всех потомков этого виджета с помощью [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]», чтобы получить класс виджета, и выполнять различные команды в зависимости от класса.

...