0

我一直在浏览几个在线资源,试图在选择另一个按钮时让我的复选按钮变灰。但是,通过我的所有尝试,我似乎无法让它发挥作用。

下面是一个工作示例: 3 个复选框,称为 chkAll、chkBalanced 和 chkFXO。假设当 chkAll 被选中并处于活动状态时,chkBalanced 和 chkFXO 被取消选中。我尝试使用查看 chkAll 状态的 if 语句,但它抱怨在块的条件部分存在状态问题。我应该考虑使用变量,如果是,我该如何实现它们?我知道 checkbuttons 有一个 -variable 选项,但我也不知道如何使用它

4

2 回答 2

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
}
于 2013-07-17T20:38:37.893 回答
0

如果您只想拥有三个呈现互斥选择的小部件,那么看在上帝的份上,请使用单选按钮来完成任务。这就是他们的目的。这就是用户所期望的。(更好的是,将它们放在标签框架中;这样可以提高可用性,而无需付出任何努力。)

如果您有其他事情要做并且需要基于检查按钮“打开和关闭”小部件,您可以通过在检查按钮选项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。您还可以将其与单选按钮混合(进行适当调整,因为状态变量不再是布尔值)。但不要仅仅为了简单的从一组中挑选一个;为此使用直接的复选按钮集合。

于 2013-07-17T22:19:44.383 回答