首頁 >後端開發 >Python教學 >將指令綁定到 Tkinter 循環中建立的按鈕時如何避免意外行為?

將指令綁定到 Tkinter 循環中建立的按鈕時如何避免意外行為?

Linda Hamilton
Linda Hamilton原創
2024-12-20 00:51:11393瀏覽

How to Avoid Unexpected Behavior When Binding Commands to Buttons Created in a Tkinter Loop?

使用命令參數綁定建立Tkinter 循環按鈕

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn