【问题标题】:passing a list into a procedure in tcl将列表传递到 tcl 中的过程
【发布时间】:2018-09-08 12:54:58
【问题描述】:

我想将一个列表传递给一个过程,但不知道怎么做。我已经看过一些如何做到这一点的例子,但是这些例子太复杂了,我不明白。列表和程序如下所示。

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

【问题讨论】:

  • 你必须解释你想要做什么。在第二个示例中,您正在测试一个值,然后将其打印出来,无论它是真还是假。在第一个示例中,您使用字符串$RS_CheckBoxes 作为参数名称,这不太可能有用。第一步,将参数列表更改为{RS_CheckBoxes},但也请让您的意图更加清晰。

标签: tcl tk proc


【解决方案1】:

您的描述并不完全清楚。是否要将全局变量名称列表传递到 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"
        }
    }
}

【讨论】:

  • 另一个建议:考虑让你的复选框变量数组元素。这可以让事情变得更容易。
  • 是的,好的,谢谢 Schelte。你能告诉我我的价值观的程序是什么样的吗?不确定是否应将 varlist 或 varname 替换为 RS_CheckBoxes。
  • proc 可以与您的列表一起使用。
  • 嗨,Schelte,我使用了你输入的内容,但得到“无法读取 var,没有这样的变量”
  • 那么你传入的变量名之一没有设置。由于您没有在代码中检查它,因此我没有将其包含在代码中。如果需要,您可以添加 info exists var 支票。
猜你喜欢
  • 2010-12-08
  • 2016-07-12
  • 2017-08-04
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 2016-09-06
  • 2019-12-03
  • 1970-01-01
相关资源
最近更新 更多