在Tkinter 中,在for 循環中建立按鈕在嘗試將每個按鈕的命令與唯一參數綁定時可能會帶來挑戰。
考慮以下場景:
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)
執行時這段程式碼中,您可能會遇到一種奇怪的行為,即按下任何按鈕總是列印相同的值,通常是最後一次迭代值。出現這種情況是因為循環中創建的每個 lambda 函數都引用相同的變數 i,該變數在每次循環迭代中都會更新。
要解決此問題,您可以利用Python 的閉包透過將i 分配給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 值,確保正確的按鈕行為。
以上是將指令綁定到 Tkinter 循環中建立的按鈕時如何避免意外行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!