Как реализовать кнопку, функциональность которой представляет собой нечто среднее между радиокнопкой и контрольной кнопкой? - PullRequest
1 голос
/ 23 июля 2011

Я хочу динамически отключить или включить checkbutton s на основе параметров, выбранных пользователем. То, что я хотел бы, - помесь между radiobutton и checkbutton.

checkbutton .c1 -text "C1" -variable c1
checkbutton .c2 -text "C2" -variable c2
checkbutton .c3 -text "C3" -variable c3
checkbutton .c4 -text "C4" -variable c4

grid .c1 -sticky w
grid .c2 -sticky w
grid .c3 -sticky w
grid .c4 -sticky w

В приведенном выше примере, если я отмечу C1, параметры C2 и C4 должны быть недоступны. Точно так же, если я проверю C3, тогда C4 должен быть серым.

Было бы замечательно, если бы существовал элегантный метод, который реализует это соотношение между radiobutton и checkbutton, которое также хорошо масштабируется при увеличении числа опций?

Ответы [ 2 ]

4 голосов
/ 23 июля 2011

Самым простым механизмом реализации этого сложного шаблона включения и выключения является наложение 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 поставляется со встроенными контроллерами для большинства базовых работ - но все это работает прямо, и вы можете настроить его один раз, а потом не возиться с ним.)

Однако не перепутайте кнопки-флажки и кнопки-переключатели (как видно из текста вашего вопроса). Пожалуйста. Это потому, что они предлагают различные визуальные подсказки для пользователей: контрольные кнопки представляют собой двухпозиционные переключатели, радиокнопки «выбирают одну из них», и использование их любым другим способом только усложнит использование без какой-либо другой выгоды.

1 голос
/ 23 июля 2011

Звучит так, будто вам просто нужно прослушивать, когда чековая книжка отмечена, и отключать / включать другие поля, основываясь на этом. Вам также может потребоваться сохранить «отключенный» счетчик для каждого блока и убедиться, что каждый блок включен только тогда, когда счетчик отключений равен нулю. Поэтому проверка C3, затем C1, затем C1 снова не включит C4, так как C4 все равно будет иметь счетчик отключений один. Повторная проверка C3 фактически приведет к тому, что счетчик отключений будет равен нулю C4, и C4 должен быть снова включен.

Вы можете обобщить эту функциональность и связать флажки некоторым описательным, а не функциональным образом.

...