0

別のボタンが選択されたときにチェックボタンをグレーアウトしようとして、いくつかのオンラインリソースを調べてきました。しかし、私のすべての試みでは、それを機能させることができないようです。

以下は実際の動作例です: chkAll、chkBalanced、chkFXO と呼ばれる 3 つのチェックボックス。chkAll が選択され、アクティブな状態のとき、chkBalanced と chkFXO がチェックされていないとします。chkAll の状態を確認する if ステートメントを使用しようとしましたが、ブロックの条件部分に状態の問題があると不平を言います。変数の使用を検討する必要がありますか? その場合、どのように実装すればよいですか? チェックボタンに -variable オプションがあることは知っていますが、その使用方法もよくわかりません

4

2 に答える 2

1

排他的な選択をしようとしている場合は、チェックボタンを使用しないでください。あなたが説明しているのは、ラジオボタンの動作です。

ラジオボタンを使用するには、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

相互に排他的な選択肢を提示する 3 つのウィジェットが必要な場合は、念のため、タスクにラジオボタンを使用してください。それが彼らの目的です。それがユーザーの期待です。(さらに良いのは、それらをラベルフレームに入れることです。これにより、わずかな労力で使いやすさが向上します。)

何か他のことが起こっていて、チェックボタンに基づいてウィジェットを「オンまたはオフ」にする必要がある場合は、チェックボタンのオプション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 を生成する可能性があります。また、ラジオボタンと混合することもできます (状態変数がブール値ではなくなるため、適切に調整します)。ただし、単純なグループから 1 つを選択するためだけに使用しないでください。そのためには、チェックボタンのストレートコレクションを使用してください。

于 2013-07-17T22:19:44.383 に答える