1

我有一个未知长度的对象列表,我想创建 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时,如何在数组中为复选框分配一个变量,或者更好的是,有没有办法直接从复选框获取当前值而不使用中间变量?

4

1 回答 1

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以便他们说出实际修改的内容(第一个参数是 now toor from,第二个是索引;由此,您应该能够非常简单地构造所需的所有元素名称)。
  • 为那些长行添加了反斜杠,以便我可以将它们分解以提高可读性。:-)
于 2012-07-29T15:16:20.637 回答