2016-06-07 51 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

嗯,不完全對吧?該命令在全局範圍內進行評估,所以第一種情況下的問題是沒有這樣的全局變量。如果存在的話,它的價值將被使用。在第二種情況下,命令調用已經有了替代變量,所以它就像在全局範圍中一樣被執行。 –

相關問題