2013-10-23 85 views
3

我在單個目錄中有許多測試文件。我正在嘗試編寫一個GUI來允許我選擇並運行其中的一個。有關將參數傳遞給tkinter按鈕命令的更多信息

所以,我有一個循環,掃描目錄,並創建按鈕:

for fnm in glob.glob ('Run*.py'): 
     tstName = fnm[3:-3]  # Discard fixed part of filename 
     btn = Button (self, text=tstName, 
         command=lambda: self.test(tstName)) 
     btn.grid (row=rowNum, column=0, pady=2) 
     rowNum += 1 

這正確創建我的GUI,用標記的按鈕說,A和B,但是當我按下按鈕標記爲A它傳遞Btest方法。

我環顧四周,發現這個問題How can I pass arguments to Tkinter button's callback command?,但答案並沒有繼續使用相同的變量名,用不同的值來配置另一個小部件。 (事實上​​,通過捆綁變量名部件名幾乎意味着該技術不會在這種情況下工作,因爲我發現。)

到Python非常新的,但我對使用Tcl/TK創建這種圖形用戶界面非常熟悉,我認識到這個問題 - 當我按下按鈕時,會傳遞tstName的值,但我希望它能夠傳遞變量在創建時的值。我知道如何在Tcl/Tk中解決這個問題 - 我會在創建時使用[list]來定義一個命令字符串,它將捕獲變量的值。

如何在Python中執行相同的操作?

回答

4

您需要綁定tstName的當前值,當時您的定義了這個按鈕。你這樣做的方式,tstName的值將是你按下按鈕時的值。

要綁定的時候,你創建按鈕的值,使用tstName的值作爲關鍵字參數對拉姆達的默認值,就像這樣:

btn = Button(..., command=lambda t=tstName: self.test(t)) 
+0

或'functools.partial(個體經營.test,tstName)' –

+0

謝謝布賴恩 - 這是訣竅。如果有人會提供一個鏈接到'lambda'的文檔,我會很感激。 – nurdglaw

相關問題