2013-07-17 2 views
0

Я просматривал несколько онлайн-ресурсов, пытаясь заставить мою контрольную кнопку седеть, когда выбрана другая кнопка. Однако, со всеми моими попытками, я не могу заставить его работать.TCL Grey Checkbuttons

Приведенный ниже пример: 3 флажка chkAll, chkBalanced и chkFXO. Предположим, что когда chkAll выбран и в активном состоянии, тогда chkBalanced и chkFXO затем не отмечены. Я попытался использовать if-statement, который рассматривает состояние chkAll, но он жалуется на наличие проблемы состояния в условной части блока. Должен ли я рассматривать использование переменных, если да, то как их реализовать? Я знаю, что у checkbuttons есть опция -variable, но я также не знаю, как ее использовать.

+0

Я немного смущен. Поведение, которое вы описываете, похоже на то, что вам нужно, это «радиообъект», а не «контрольная кнопка». И я совсем не уверен, что означает «он жалуется на то, что проблема состояния в условной части блока» означает. Возможно, некоторые специальные коды или сообщения об ошибках помогут. –

+0

Итак, у меня есть checkbox под названием chkAll, а затем под ним есть группа флажков, которые являются отдельными тестами, которые включены в «мастер». Однако, если пользователь не хочет запускать полномасштабный тест, он должен иметь возможность выбирать различные тесты, которые он/она хотел бы запустить. Итак, если выбран флажок мастера, то, вероятно, все индивидуальные тесты, найденные ниже, уже включены, и поэтому нет необходимости выбирать эти флажки. – ButtahNBred

ответ

1

Если вы пытаетесь сделать эксклюзивный выбор, вы не должны использовать контрольные кнопки. То, что вы описываете, - это поведение радиолюбителей.

Чтобы использовать радиокнопки, вы создаете два или более и даете им все одинаковые переменные. Тогда вы сможете выбирать только по одному.

foreach value {chkAll chkBalanced chkFXO} { 
    radiobutton .rb-$value -text $value -variable myvar \ 
     -justify left -value $value 
    pack .rb-$value -side top -fill x -anchor w 
} 
+0

Лучше всего указывать опцию '-value' для каждого, а не полагаться на значение по умолчанию. –

+0

@ DonalFellows: спасибо, что поймали это! Первоначально у меня был пример tkinter, где я это сделал, тогда я понял, что вопрос был о tcl, поэтому я смутно заменил этот пример. –

0

Если вы просто хотите иметь три виджета, которые представляют взаимоисключающий выбор, ради бога использовать радиокнопки для выполнения этой задачи. Для этого они и есть. Это то, чего ожидают пользователи. (Еще лучше, положите их в labelframe, что улучшает удобство использования для небольших усилий.)

Если у вас есть что-то еще, и вам нужно «включать и выключать» виджеты на основе контрольной кнопки, вы делаете это поместив запись trace на переменную, на которую ссылается опция checkbox -variable. Затем эта трассировка должна включать (изменить на -state normal) или отключить (изменить на -state disabled) другие виджеты, когда он срабатывает, в зависимости от значения переменной.

checkbutton .cb -variable bools(cb) -text "Foo Bar" 
button .other -text "Example extra content" 
button .widget -text "Second ordinary button" 
# NOTE the ;# at the end; IMPORTANT HACK to discard trace arguments 
trace add variable bools(cb) {changed bools(cb) .other .widget;#} 
proc changed {varName args} { 
    upvar "#0" $varName var 
    foreach w $args { 
     if {$var} { 
      $w configure -state normal 
     } else { 
      $w configure -state disabled 
     } 
    } 
} 
set bools(cb) 0; # <<< Initialize to known state 
pack .cb .other .widget 

Такая вещь может стать довольно сложной и произвести очень приятные графические интерфейсы. Вы также можете смешивать его с помощью радиообъектов (с соответствующими настройками, поскольку переменные состояния больше не являются логическими). Но не делайте этого просто для простой группы «pick-one-from-group»; используйте для этого прямую коллекцию контрольных кнопок.

+0

Я попытался запустить ваш пример и получил следующее> пожелание test.tcl Ошибка при запуске скрипта: неверно # args: должно быть указано «команда« добавить имя переменной переменной opList » при выполнении « trace add variable bools (cb) {изменено bools (cb) .other .widget \; #} " (файл" test.tcl "строка 5) –

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