在tcl/tk中使用for循环创建多个输入框

在tcl/tk中使用for循环创建多个输入框,tcl,tk,Tcl,Tk,嗨,我有一个整数值,根据这个值,我必须在tcl/tk gui中创建输入框。所以我做了这样的事情: set frame1 [::hwt::LabeledFrame [::hwt::WindowRecess editThicknessWindow].frame1 "Current List: " \ -expand 0 -relief flat -anchor e -side to

嗨,我有一个整数值,根据这个值,我必须在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
    }       
set i 0
foreach item $arr_attribOptions(Thickness) {
    set varname arr_attribOptions(Thickness,$i)
    set $varname $item
    incr i
}
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
}
设置frame1[::hwt::LabeledFrame[::hwt::WindowRecurse editThicknessWindow]。frame1“当前列表:”\
-扩展0-卸压平面-锚e-侧顶部-焊盘15]
对于{set i 0}{$i<$length_Thickness}{incr i}{
设置条目号标签“$i[::hwt::AddEntry$frame1”。条目号标签“[eval$i]label”列表值“$i:”labelwidth 15\
entryWidth 10 anchor nw validate real text[名称空间当前]::arr_attributionsValue(厚度)[$i]状态正常\
withoutPacking-textvariable[名称空间当前]::lst_值[$i]]
包装$Entry\ U No\评估$i]-侧面顶部-锚nw-焊盘10-焊盘10
}       

假设整数为3,那么我必须创建3个输入框。我有一个列表“arr_attributionsvalue(Thickness)”,其中有3个值,因此我希望列表中的值填充到入口框中。因为我是tcl/tk新手,所以不确定语法是否正确,或者是否遗漏了什么。我很困惑,就像我正在创建tk变量Entry_No_uu$I,在包中我正在使用$Entry_No_u[eval$I],那么这两个值是指相同的值还是语法错误

首先,如果你在创建变量,比如
$Entry\u No\u[eval$i]
,那么我真的认为你做得不对。这样的复合变量实际上更容易作为数组元素来完成,比如
Entry\u No($i)
,其中没有
eval
,以混淆事物(或者
$Entry\u No($i)
从元素中读取而不是命名它)

其次,
[namespace current]:arr_attributionsvalue(Thickness)[$i]
更可能是错误的,特别是因为
$i
将是一个整数。您无法处理这样的列表中的元素(没有人建议它应该是可能的,但这肯定不会在接下来的几个月内发生,而且肯定不会与这样的数组结合使用)。相反,最简单的机制是使用从源列表填充的另一个数组,并在必要时使用跟踪进行耦合。(跟踪是一种更高级的技术;如果需要,可以问另一个问题。)从列表中填充工作数组可以这样做:

    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
    }       
set i 0
foreach item $arr_attribOptions(Thickness) {
    set varname arr_attribOptions(Thickness,$i)
    set $varname $item
    incr i
}
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
}
是的,您可以在变量中存储变量名。(读取时,使用
[set$varname]
执行双重解引用。)

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

第四,请使用
variable
(或
upvar
名称空间upvar
)以避免使用完全限定的变量


总的来说,我们可以将这些技术结合起来,得到如下结果:

    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
    }       
set i 0
foreach item $arr_attribOptions(Thickness) {
    set varname arr_attribOptions(Thickness,$i)
    set $varname $item
    incr i
}
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
}
设置frame1[::hwt::LabeledFrame[::hwt::WindowRecurse editThicknessWindow]。frame1“当前列表:”\
-扩展0-卸压平面-锚e-侧顶部-焊盘15]
名称空间upvar[名称空间当前]\
arr_属性选项属性arr_值lst_值列表
设置i 0
foreach项目$attribs(厚度){
设置属性(厚度,$i)$item
设置值($i)[lindex$valueList$i]
增量i
}
对于{set i 0}{$i<$length_Thickness}{incr i}{
设置条目号($i)[::hwt::AddEntry$frame1.条目号($i label)列表值($i:“labelwidth 15\
entryWidth 10锚nw验证实文本arr_attribOptions(厚度,$i)状态正常\
withoutPacking-textvariable[名称空间当前]::arr_值($i)]
包装$Entry_No($i)-侧面顶部-锚nw-padx 10-pady 10
}

我不知道我已经发现了所有的问题(大多数Tcl程序员在变量名上不使用匈牙利式前缀),但现在它更接近于惯用语。

在我看来,这个命令需要做更多的工作,但我自己没有时间做……感谢Donal的帮助,::hwt::AddEntry命令只是tk的AddEntry命令。我想这就是我们一直在使用的名称空间。