Самым простым механизмом реализации этого сложного шаблона включения и выключения является наложение trace
на триггерные переменные (c1
и c3
в вашем примере), чтобы при каждом их изменении вы пересчитывали состояния.
# _After_ initializing the state...
trace add variable c1 write reconfigureButtons
trace add variable c3 write reconfigureButtons
proc reconfigureButtons args {
global c1 c3
.c2 configure -state [expr {$c1 ? "disabled" : "normal"}]
.c4 configure -state [expr {$c1||$c3 ? "disabled" : "normal"}]
}
(Концептуально, вы вешаете кусок Контроллера с Модели, а не с Представления, как это более «стандартно» - мы обычно не говорим с точки зрения MVC для Tk, потому что Tk поставляется со встроенными контроллерами для большинства базовых работ - но все это работает прямо, и вы можете настроить его один раз, а потом не возиться с ним.)
Однако не перепутайте кнопки-флажки и кнопки-переключатели (как видно из текста вашего вопроса). Пожалуйста. Это потому, что они предлагают различные визуальные подсказки для пользователей: контрольные кнопки представляют собой двухпозиционные переключатели, радиокнопки «выбирают одну из них», и использование их любым другим способом только усложнит использование без какой-либо другой выгоды.