我想将列表传递到过程中,但不确定如何传递。我看过一些有关如何执行此操作的示例,但是这些示例太复杂了,我不理解它们。列表和过程如下所示。
set RS_CheckBoxes [list kl15_cb din1_cb din2_cb din3_cb din4_cb \
dinnc_cb ain1_cb ain2_cb ain3_cb ain4_cb a_cb \
b_cb u_cb v_cb w_cb sin_cb cos_cb th1_cb th2_cb hvil_cb]
tk::button .rs.enter -height 2 -text "Enter" -width 10 -command {x $RS_CheckBoxes}
proc x {$RS_CheckBoxes} {
if {$RS_CheckBoxes} {
puts "ON"
} else {
puts "OFF"
}
}
目前,我正在使用以下代码,但希望减少行数。
tk::button .relSel.b -height 2 -text "Enter" -width 10 -command {if {$kl15_cb} {
puts "$kl15_cb"
} else {
puts "$kl15_cb"
}
if {$dinnc_cb} {
puts "$dinnc_cb"
} else {
puts "$dinnc_cb"
}
if {$din1_cb} {
puts "$din1_cb"
} else {
puts "$din1_cb"
}
if {......... etc}
............. etc
答案 0 :(得分:0)
您的描述不完全清楚。您是否要将全局变量名称列表传递给proc,然后根据其布尔值打印ON或OFF?
当前,您似乎只是以一种非常复杂的方式打印变量的值。
if {$dinnc_cb} {
puts "$dinnc_cb"
} else {
puts "$dinnc_cb"
}
等于puts $dinnc_cb
,除非您希望代码无法将值解释为布尔值时抛出错误。
如果我的理解正确,请尝试以下操作:
proc x {varlist} {
foreach varname $varlist {
upvar #0 $varname var
puts "$varname: [lindex {ON OFF} [expr {!$var}]]"
}
}
upvar创建从$ varname中的全局变量到局部变量var的链接。然后,您可以使用它来检查全局变量。
要包括检查变量是否已设置:
proc x {varlist} {
foreach varname $varlist {
upvar #0 $varname var
if {[info exists var]} {
puts "$varname: [lindex {OFF ON} [string is true -strict $var]]"
} else {
puts "$varname: INDETERMINATE"
}
}
}