2016-06-07 90 views
1

我期待建立一个功能近期开启文件添加到菜单和命令(事件)时,点击打开它,但一个错误出现错误无法读取“文件名”:没有这样的变量

错误:

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 

} 

回答

2

你好像在v延迟评估太可怕了。取而代之的

... - command {fileOpen $filename} 

尝试

... - command [list fileOpen $filename] 

当您使用{braces},所有的变量替换被抑制,因此命令变成文字串fileOpen $filename再后来,你会尝试打开一个字面上的文件名为“$文件名”。

使用[list fileOpen $filename],您允许扩展变量,但也要确保即使文件名包含空格,您也只能将一个参数传递给fileOpen过程。

+0

谢谢,你能解释一下为什么我们需要[list ..]使它工作吗? –

+2

嗯,不完全对吧?该命令在全局范围内进行评估,所以第一种情况下的问题是没有这样的全局变量。如果存在的话,它的价值将被使用。在第二种情况下,命令调用已经有了替代变量,所以它就像在全局范围中一样被执行。 –

相关问题