也就是說它是如何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」的即時值的變量
非常感謝,我會嘗試一下!這是一個常見問題嗎?我只是一名自學成才的程序員,但我覺得這在Python中有點限制... – MiddleClassMan
這更多的是關於「Tkinter」 - 圖形工具包而不是Python。 Tkinter在Windows中捆綁了Python,但它不是唯一可供選擇的圖形工具包。一旦人們理解了這一點,就很容易編寫一堆輔助函數來自動化這類事情。 – jsbueno