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 个输入框。我有一个列表“arr_attribOptionsValue(Thickness)”,其中包含 3 个值,因此我希望将列表中的值填充到输入框中。由于我是 tcl/tk 的新手,所以不确定语法是否正确或者我是否遗漏了什么。我很困惑,就像我正在创建 tk 变量 Entry_No_$i 并且在包中我使用的是 $Entry_No_[eval $i] 所以这两个是指相同的值还是语法错误。

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]做双重取消引用。)

第三,小部件名称最好不包含大多数非字母数字字符(.当然,除了 )并且不以大写字母开头任何组件(出于与窗口类相关的技术原因)。

第四,请使用variable(或upvarnamespace 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 回答