在 Tkinter 中,在循環中建立多個按鈕對於產生動態使用者介面非常有用。但是,將命令參數傳遞給按鈕可能會帶來挑戰,尤其是在嘗試區分按下了哪個按鈕時。
考慮以下程式碼,其中建立的按鈕的標題會透過循環計數器遞增:
def createGameURLs(self): self.button = [] for i in range(3): self.button.append(Button(self, text='Game '+str(i+1), command=lambda: self.open_this(i))) self.button[i].grid(column=4, row=i+1, sticky=W) def open_this(self, myNum): print(myNum)
當我們嘗試在按一下其中任何一個按鈕時列印按鈕的識別碼(myNum) 時,就會出現問題。輸出始終顯示 2,即上次迭代的值。這種行為表明,儘管按鈕的標題不同,但它們本質上是無法區分的。
要解決此問題,我們需要確保每個按鈕在創作時間。為了實現這一點,我們可以採用一種巧妙的lambda 函數技術:
def createGameURLs(self): self.button = [] for i in range(3): self.button.append(Button(self, text='Game '+str(i+1), command=lambda i=i: self.open_this(i))) self.button[i].grid(column=4, row=i+1, sticky=W) def open_this(self, myNum): print(myNum)
透過在lambda 函數中添加賦值i=i,我們可以有效地「凍結」 lambda 時i 的當前值被定義。這確保了即使在循環完成後每個按鈕仍保持其唯一識別碼。
這種技術允許我們在循環內動態創建多個 Tkinter 按鈕,其中每個按鈕可以在以下情況下被唯一標識:點擊。透過了解 lambda 函數和閉包的行為,我們可以在 Tkinter 應用程式中實現更多控制和靈活性。
以上是如何將唯一參數傳遞給循環中建立的多個 Tkinter 按鈕?的詳細內容。更多資訊請關注PHP中文網其他相關文章!