我有一个未知长度的对象列表,我想创建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
,如何在数组中为复选框分配变量,或者更好的是,有没有办法直接从复选框获取当前值而不使用中间变量
答案 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
的参数,以便他们说出实际修改的内容(第一个参数现在是to
或from
,第二个参数是索引;从那里,你应该能够非常简单地构建你需要的所有元素名称。