如果您只想拥有三个呈现互斥选择的小部件,那么看在上帝的份上,请使用单选按钮来完成任务。这就是他们的目的。这就是用户所期望的。(更好的是,将它们放在标签框架中;这样可以提高可用性,而无需付出任何努力。)
如果您有其他事情要做并且需要基于检查按钮“打开和关闭”小部件,您可以通过在检查按钮选项trace
引用的变量上写入来完成此操作。-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
这种事情会变得非常复杂,并产生非常好的 GUI。您还可以将其与单选按钮混合(进行适当调整,因为状态变量不再是布尔值)。但不要仅仅为了简单的从一组中挑选一个;为此使用直接的复选按钮集合。