相互に排他的な選択肢を提示する 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 つを選択するためだけに使用しないでください。そのためには、チェックボタンのストレートコレクションを使用してください。