如何将列表的内容发送到Tcl中的过程中?

如何将列表的内容发送到Tcl中的过程中?,tcl,tk,Tcl,Tk,我有一个TCL过程,它对返回列表的已加载包进行函数调用。当我用llindex查询列表中的条目数时,它是准确的。但是,当我将该列表发送到填充Tk列表框的过程时,该列表没有条目;llindex函数表示列表中的实体数为零。对于一段代码,在我的主代码中有: set ents [pw::Grid getAll -type pw::Connector] makeWindow . $ents $ents包含17个元素。然后在makeWindow过程中,我有: makeWindow {root args} {

我有一个TCL过程,它对返回列表的已加载包进行函数调用。当我用llindex查询列表中的条目数时,它是准确的。但是,当我将该列表发送到填充Tk列表框的过程时,该列表没有条目;llindex函数表示列表中的实体数为零。对于一段代码,在我的主代码中有:

set ents [pw::Grid getAll -type pw::Connector]
makeWindow . $ents
$ents包含17个元素。然后在makeWindow过程中,我有:

makeWindow {root args} {
    label $base.targetDeltaTxt -text "Target Cell:"
    entry $base.targetDelta -cursor {} -textvariable entry
    ...
    set num_cons [expr ([llength $args]-1)]
    ...
}

$num_cons为1,但发送时为17。在TCL中,向过程发送列表似乎会将所有列表元素连接到一行文本中。为什么?

您遇到了这样一个事实,即拥有名为args的过程的最后一个参数会导致特殊行为。有关详细信息,请参阅。将参数从args重命名为其他任何内容(例如ents)都可以解决问题。

我认为您必须发布一些代码让我们看到问题。从问题的措辞来看,我有一个印象,您使用了lindex命令,其中llength是合适的。lindex返回列表中的值,llength返回列表中链接不起作用的长度。但将args更改为连接器使该过程按预期工作。奇怪的是,args是一个关键字。@StephenAlter args可能非常有用。在特定情况下,如果希望保留名称args,可以使用[llength[lindex$args 0]],因为它是一个包含传递给过程的所有附加参数的列表。文档链接的另一种形式是,另一个可能有助于解释的页面是