Tcl 错误可能是';“我不读”;文件名";:没有这样的变量

Tcl 错误可能是';“我不读”;文件名";:没有这样的变量,tcl,tk,Tcl,Tk,我希望创建一个函数,将最近打开的文件添加到菜单中,并在单击时命令(事件)将其打开,但出现错误 错误: Error can't read "filename" : no such variable proc add_Recentfiles {filename} { global recentFiles ... $m insert $recentFiles(index) \ command -label $labelText -command {fileOpen $filena

我希望创建一个函数,将最近打开的文件添加到菜单中,并在单击时命令(事件)将其打开,但出现错误

错误:

Error can't read "filename" : no such variable
proc add_Recentfiles {filename} {
 global recentFiles
 ...
 $m insert $recentFiles(index) \
       command -label $labelText -command {fileOpen $filename}
 ...
}

proc fileOpen { filename } {
    #refresh textbox
    .textarea.txt delete 0.0 end

    set fileid [open $filename r]
    set data [read $fileid]

    .textarea.txt insert end $data
    .textarea.l  configure -text $filename

    addRecentFile $filename 

    close $fileid

}
代码:

Error can't read "filename" : no such variable
proc add_Recentfiles {filename} {
 global recentFiles
 ...
 $m insert $recentFiles(index) \
       command -label $labelText -command {fileOpen $filename}
 ...
}

proc fileOpen { filename } {
    #refresh textbox
    .textarea.txt delete 0.0 end

    set fileid [open $filename r]
    set data [read $fileid]

    .textarea.txt insert end $data
    .textarea.l  configure -text $filename

    addRecentFile $filename 

    close $fileid

}

看起来您对变量的计算延迟得太长了。而不是

... - command {fileOpen $filename} 
试一试

当您使用
{brages}
时,所有变量替换都将被抑制,因此该命令将成为文本字符串
fileOpen$filename
,然后您将尝试打开一个名为“$filename”的文件


使用
[list fileOpen$filename]
,您可以扩展变量,但也可以确保即使文件名包含空格,您也将只向fileOpen进程传递一个参数。

谢谢,您能解释一下为什么需要[list..]使其工作吗?嗯,不完全是这样,对吗?命令是在全局范围内计算的,因此第一种情况下的问题是没有这样的全局变量。如果存在,将使用其值。在第二种情况下,命令调用已经替换了变量,因此它只是在全局范围内按原样执行。