Tcl 使用返回的数组

Tcl 使用返回的数组,tcl,tk,Tcl,Tk,我正在尝试运行一个过程,该过程获取一个名为ds_out的数组,根据复选框的状态将ds_out(0)和ds(1)的值更改为0或1,并返回它。然后我想在该过程之后输出值,但看起来该过程没有返回数组并在初始化数组中打印值。如果您在程序中有puts行,它就会工作 我看过教程和示例,但不理解它们。我想要一些基本的例子,但找不到 以下是我使用的代码: global ds_out array set ds_out { 0 0 1 0 } proc kl15cb {} { checkbutton .k

我正在尝试运行一个过程,该过程获取一个名为ds_out的数组,根据复选框的状态将ds_out(0)和ds(1)的值更改为0或1,并返回它。然后我想在该过程之后输出值,但看起来该过程没有返回数组并在初始化数组中打印值。如果您在程序中有puts行,它就会工作

我看过教程和示例,但不理解它们。我想要一些基本的例子,但找不到

以下是我使用的代码:

global ds_out
array set ds_out {
0   0
1   0
}

proc kl15cb {} {
checkbutton .kl15_cb -width 10 -height 1 -text "check me" -variable kl15_cb              -command {if {$kl15_cb} {
set ds_out(0) 0
set ds_out(1) 0
pack .kl15_cb
} else {
set ds_out(0) 1
set ds_out(1) 1
pack .kl15_cb
return [array get ds_out]
} } }

kl15cb
puts $ds_out(0)
puts $ds_out(1)
pack .kl15_cb

无意冒犯,但您的代码基于一些严重的误解。这里不处理调用堆栈,代码可以将值从一个作用域返回到调用作用域

-command
选项中的代码是面向事件的回调。当执行过程时,它不会执行,只是作为字符串传递给checkbutton。单击checkbutton时,回调将在全局范围内执行,并且它没有可返回值的内容

也许这个片段可以帮助您:

array set ds_out {
    0   0
    1   0
}

checkbutton .kl15_cb -width 10 -height 1 -text "check me" -variable kl15_cb -command {
    set ds_out(0) $kl15_cb
    set ds_out(1) $kl15_cb
}
pack .kl15_cb

如果您运行该代码,然后
array get ds\u out
您将得到
0 1 0
。现在点击复选框并再次调用
array get ds_out
;现在您得到了
011

这是一个范围问题。在进程内部,ds_out是一个本地数组。可以使用global ds_out命令使全局数组可用。或者,您可以使用upvar,或者在调用proc时创建一个新数组。@特洛伊木马名称:名称
ds\u out
永远不会在过程的本地作用域中使用,只能在回调脚本中全局使用。