嗨我有一个整数值,并根据我必须在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]所以这两个引用相同的值还是错误的语法。
答案 0 :(得分: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
(或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程序员都没有在变量名上使用匈牙利语类型前缀)但现在它更接近于惯用语。