将列表传递到tcl中的过程

时间:2018-09-08 12:54:59

标签: tcl tk proc

我想将列表传递到过程中,但不确定如何传递。我看过一些有关如何执行此操作的示例,但是这些示例太复杂了,我不理解它们。列表和过程如下所示。

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

1 个答案:

答案 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"
        }
    }
}