2011-12-01 94 views
2

我有一個相當簡單的Python問題,我真的很難解決。來自Tkinter.Button的命令

我在Tk窗口小部件中有一個LabelFrame小部件。 LabelFrame包含許多小部件,包括標籤,條目小部件和按鈕。按下按鈕後,我想執行def,但是想要將輸入小部件中的用戶輸入發送給def進行處理。然而。當我在按鈕的命令中添加任何參數(例如command = make_new_user(entry1,entry2)時,該命令在運行代碼時自動執行,甚至沒有按下按鈕,我只希望該命令在按下按鈕時執行,但也能夠將參數發送到處理高清

任何人都可以在這方面幫助請

感謝, MiddleClassMan

回答

1

也就是說它是如何supposd是 - ?當你添加後的括號是你調用它的一個函數的名字,只使用它的名字,就是引用該函數對象

TKinter本身不允許向參數添加回調。

通常要做的事情是建立一個「扔掉功能」,使用「拉姆達」關鍵字 - 此扔掉函數接收任何參數本身 - 但它記錄裏面本身 參數要傳承給你真正的處理者。

所以,如果身在何處,只有如此,這將是代替書面情況:

Button(..., command=handler(par1, par2), ...)

寫:

Button(..., command=(lambda: handler(par1, par2)), ...)

然而,有一件事在如果「par1」和「par2」是變量,則它們的值是「live」 - 這意味着發送到Button的參數將是watherver值p ar1和par2在按下按鈕時按住。

避免這種情況的方法是使用lambda關鍵字 添加另一個間接級別,以便在創建按鈕時將參數值「凍結」。

對於readbility的緣故,一個更好的做到這一點的2線,而不是內聯它 在按鈕創建調用:

command = (lambda p1, p2: lambda: handler(p1, p2)) (par1, par2) 
Button = (..., command=command, ...) 

這樣做,這樣,變量「命令」將包含一個扔掉功能其中變量「p1」和「p2」具有「par1」和「par2」的即時值的變量

+0

非常感謝,我會嘗試一下!這是一個常見問題嗎?我只是一名自學成才的程序員,但我覺得這在Python中有點限制... – MiddleClassMan

+0

這更多的是關於「Tkinter」 - 圖形工具包而不是Python。 Tkinter在Windows中捆綁了Python,但它不是唯一可供選擇的圖形工具包。一旦人們理解了這一點,就很容易編寫一堆輔助函數來自動化這類事情。 – jsbueno