1

長さが不明なオブジェクトのリストがあります。チェックボックスの 2 つのリストを作成し、各リストにリストの各行のチェックボックスを作成したいと考えています。また、チェックボックスにアクセスしてその値を確認できるようにする必要もあります。

パスからチェックボックスの値を取得する方法が見つからなかったので、チェックボックスの変数を保持するグローバル配列を作成したいと思い、次のことを試しました。

    global cb
    set i 0
    foreach port $ports {
    set to_cb    [checkbutton $to.cb_to_$i     -variable [list $cb(to$i)]   -text $port -command [list __sp_from_to_changed $from $to]]
    set from_cb  [checkbutton $from.cb_from_$i -variable [list $cb(from$i)] -text $port -command [list __sp_from_to_changed $from $to]]

    grid $to_cb   -row [expr $i + 2] -sticky nsew
    grid $from_cb -row [expr $i + 2] -sticky nsew
    incr i

エラーが発生can't read "cb(to0)": no such variableした場合、チェックボックスの配列内に変数を割り当てるにはどうすればよいですか、またはさらに良いことに、中間変数を使用せずにチェックボックスから直接現在の値を取得する方法はありますか?

4

1 に答える 1

1

チェックボタンは常に変数にバインドする必要があります (デフォルトがありますが、それを使用したくありません)。必要なことは、チェックボタンごとに一意の変数の名前を生成することです。ここでは、配列要素が優れた選択肢です。

では、あなたのコードの問題は何ですか? $変数の前にa を置いて、変数を逆参照しようとしているだけです。他のいくつかの言語とは異なり、Tclは常に$を「この変数を読み取る」という意味で使用します (正規表現を除く)。list変数名を;で囲む必要もありません。これは、生成されたスクリプトに入れる場合にのみ役立ちます。代わりに、次のような行が必要です。

set to_cb    [checkbutton $to.cb_to_$i     -variable cb(to$i)   -text $port \
        -command [list __sp_from_to_changed to $i]]
set from_cb  [checkbutton $from.cb_from_$i -variable cb(from$i) -text $port \
        -command [list __sp_from_to_changed from $i]]

ここでの変更点は次のとおりです。

  • -variableオプションの値から余分に生成された複雑さを取り除きました。そのままの配列要素名で十分です。
  • 引数を に更新して、__sp_from_to_changed実際に何が変更されたかを示すようにしました (最初の引数は nowtoまたはfromで、2 番目の引数はインデックスです。そこから、必要なすべての要素名を簡単に作成できるはずです)。
  • 読みやすくするために分割できるように、これらの長い行にバックスラッシュを追加しました。:-)
于 2012-07-29T15:16:20.637 に答える