如何创建一个数组来保存Tk Tcl中几个自动生成的复选框的值

时间:2012-07-29 11:47:14

标签: arrays tcl tk

我有一个未知长度的对象列表,我想创建2个复选框列表,在每个列表中为列表的每一行创建一个复选框。我还需要能够进入复选框并检查它们的价值。

由于我没有找到从路径中获取复选框值的方法,我想创建一个全局数组来保存复选框的变量,并尝试了以下内容:

    global cb
    set i 0
    foreach port $ports {
    set to_cb    [checkbutton $to.cb_to_$i     -variable [list $cb(to$i)]   -text $port -command [list __sp_from_to_changed $from $to]]
    set from_cb  [checkbutton $from.cb_from_$i -variable [list $cb(from$i)] -text $port -command [list __sp_from_to_changed $from $to]]

    grid $to_cb   -row [expr $i + 2] -sticky nsew
    grid $from_cb -row [expr $i + 2] -sticky nsew
    incr i

当我获取它时得到错误can't read "cb(to0)": no such variable,如何在数组中为复选框分配变量,或者更好的是,有没有办法直接从复选框获取当前值而不使用中间变量

1 个答案:

答案 0 :(得分:1)

Checkbuttons总是需要绑定到一个变量(有一个默认值,但你不想使用它)。您需要做的是生成每个检查按钮唯一的变量的名称;数组元素是优秀的选择。

那么代码中的问题是什么?只是你试图通过在它们前放一个$来取消引用变量;与其他语言不同,Tcl 总是使用$来表示“读取此变量”(正则表达式除外)。您也不需要在list中包装变量名称;只有将它放入生成的脚本中才有用。相反,你需要这样的行:

set to_cb    [checkbutton $to.cb_to_$i     -variable cb(to$i)   -text $port \
        -command [list __sp_from_to_changed to $i]]
set from_cb  [checkbutton $from.cb_from_$i -variable cb(from$i) -text $port \
        -command [list __sp_from_to_changed from $i]]

这里的变化是:

  • -variable选项的值中删除了额外生成的复杂性;一个简单的数组元素名称就足够了。
  • 更新了__sp_from_to_changed的参数,以便他们说出实际修改的内容(第一个参数现在是tofrom,第二个参数是索引;从那里,你应该能够非常简单地构建你需要的所有元素名称。
  • 为这些长行添加了反斜杠,因此我可以将其拆分以便于阅读。 : - )