0

こんにちは、整数値があり、その値に基づいて、tcl/tk GUI でエントリ ボックスを作成する必要があります。だから私はこのようなことをしました:

    set frame1 [::hwt::LabeledFrame [::hwt::WindowRecess editThicknessWindow].frame1 "Current List: " \
                                                        -expand 0 -relief flat -anchor e -side top -pady 15]

    for {set i 0} {$i < $length_Thickness} {incr i} {
        set Entry_No_$i [::hwt::AddEntry $frame1.Entry_No_[eval $i] label "List Values_$i :" labelwidth 15 \
          entryWidth 10 anchor nw validate real text [namespace current]::arr_attribOptionsValue(Thickness)[$i] state normal \
          withoutPacking -textvariable [namespace current]::lst_Value[$i] ]
          pack $Entry_No_[eval $i] -side top -anchor nw -padx 10 -pady 10
    }       

整数が 3 の場合、3 つのエントリ ボックスを作成する必要があります。3 つの値を含むリスト "arr_attribOptionsValue(Thickness)" があるので、リストの値をエントリ ボックスに入力します。私は tcl/tk を初めて使用するので、構文が正しいかどうか、または何かが足りないかどうかわかりません。私は tk 変数 Entry_No_$i を作成していて、パックで $Entry_No_[eval $i] を使用しているように混乱しているので、これら 2 つは同じ値を参照するのでしょうか、それとも構文が間違っているのでしょうか。

4

1 に答える 1

2

まず、そのような変数を作成している場合$Entry_No_[eval $i]、私はあなたがそれを間違った方法で行っていると本当に思います。このような複合変数は、などの配列要素として非常に簡単に実行でき、混乱させることはありEntry_No($i)ません(または、名前を付ける代わりに要素から読み取ることもできません)。eval$Entry_No($i)

第二に、特に整数の場合は[namespace current]::arr_attribOptionsValue(Thickness)[$i]特に、間違っている可能性がさらに高くなります。そのようなリストの要素に対処することはできません(それが可能であるはず$iであるとは示唆されていませんが、それは確実に今後数か月で起こることはなく、確かにそのような配列と組み合わせることはありません) 。代わりに、最も単純なメカニズムは、ソースリストから入力した別の配列を使用し、必要に応じてトレースを使用して結合することです。(トレースはより高度な手法です。必要に応じて別の質問をしてください。)リストから作業配列にデータを入力するには、次のようにします。

set i 0
foreach item $arr_attribOptions(Thickness) {
    set varname arr_attribOptions(Thickness,$i)
    set $varname $item
    incr i
}

はい、変数名を変数に格納できます。(読むとき[set $varname]は、二重逆参照を行うために使用します。)

第3に、ウィジェット名は、英数字以外の文字がほとんど含まれておらず(.もちろん、を除く)、大文字で始まるコンポーネントがない場合に最適です(ウィンドウクラスに関連する技術的な理由から)。

第4に、完全修飾変数を使用する必要がないように、variable(またはupvarまたは)を使用してください。namespace upvar


全体として、これらの手法を一緒に使用して、次のようなものを取得できます。

set frame1 [::hwt::LabeledFrame [::hwt::WindowRecess editThicknessWindow].frame1 "Current List: " \
        -expand 0 -relief flat -anchor e -side top -pady 15]

namespace upvar [namespace current] \
        arr_attribOptions attribs arr_values values lst_Value valueList
set i 0
foreach item $attribs(Thickness) {
    set attribs(Thickness,$i) $item
    set values($i) [lindex $valueList $i]
    incr i
}

for {set i 0} {$i < $length_Thickness} {incr i} {
    set Entry_No($i) [::hwt::AddEntry $frame1.entry_No_$i label "List Values_$i :" labelwidth 15 \
            entryWidth 10 anchor nw validate real text arr_attribOptions(Thickness,$i) state normal \
            withoutPacking -textvariable [namespace current]::arr_values($i)]
    pack $Entry_No($i) -side top -anchor nw -padx 10 -pady 10
}

私はまだすべての問題を特定したことを知りません(そしてほとんどのTclプログラマーは変数名にハンガリー語の型プレフィックスを使用していません)が、今では慣用句にかなり近づいています。

于 2012-12-17T23:25:54.173 に答える