2010-02-08 3 views

ответ

5

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

+0

в tcl recursion proc можно сохранить предыдущее состояние виджета? Поэтому в следующий раз я могу включить только те, которые отключены. – OliveOne

+0

Я думал использовать ргос walkIntoTKTree {W} { \t набор глубины 0 \t в то время как {$ глубина <[llength [winfo детей $ ш]]} { \t \t \t walkIntoTKTree [LINDEX [winfo детей $ W] $ глубина] \t \t \t incr глубина; \t} \t puts "w = $ w" } но ур солн лучше – OliveOne

Смежные вопросы