Как реализовать кнопку, функциональность которой представляет собой нечто среднее между радиокнопкой и флажком?

Я хочу динамически отключать или включать checkbuttons в зависимости от параметров, которые выбирает пользователь. То, что я хотел бы, это нечто среднее между 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, который также хорошо масштабируется по мере увеличения количества вариантов?


person Anand    schedule 22.07.2011    source источник


Ответы (2)


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

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

person Donal Fellows    schedule 23.07.2011
comment
Кроме того, демонстрация Tk widget (в версии 8.5) включает в себя демонстрацию включения вещей с помощью кнопки-флажка. - person Donal Fellows; 23.07.2011
comment
Исправление: trace variable c1 w reconfigureButtons вместо trace add variable c3 write reconfigureButtons - person Anand; 25.07.2011
comment
@Anand: Только если вы настолько сильно застряли в прошлом, что все еще используете Tcl 8.3. Если да, ПОЛУЧИТЕ ПРОГРАММУ! Версия 8.3 устарела уже много лет. Его преемник, 8.4, тоже близок к EOL (окончательный релиз будет после выхода 8.6.0). Производственный код должен использовать 8.5. - person Donal Fellows; 26.07.2011
comment
(Старый синтаксис по-прежнему поддерживается, но правда, зачем вам его по-прежнему использовать? Он далеко не такой мнемонический и, скорее всего, когда-нибудь в будущем исчезнет — хотя, если честно, не в версии 8.6.) - person Donal Fellows; 26.07.2011
comment
Я пробовал код, используя старое желание; Я понял, что это было старое желание после прочтения вашего комментария. Прошу прещения за это. - person Anand; 26.07.2011

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

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

person cwharris    schedule 22.07.2011