首頁 >後端開發 >Python教學 >在 Tkinter For 迴圈中指派按鈕指令時如何避免 Lambda 閉包問題?

在 Tkinter For 迴圈中指派按鈕指令時如何避免 Lambda 閉包問題?

Patricia Arquette
Patricia Arquette原創
2024-12-18 07:44:17175瀏覽

How to Avoid Lambda Closure Issues When Assigning Button Commands in a Tkinter For Loop?

Tkinter 使用Lambda 在For 迴圈中指派按鈕指令

在Tkinter 中,您可能會遇到需要使用for 迴圈動態建立多個按鈕的場景,而每個按鈕都應該有一個與其關聯的唯一命令。但是,如果您直接在命令的 lambda 表達式中使用循環變量,則可能會遇到潛在的問題。

請考慮以下程式碼:

users = {"Test": "127.0.0.0", "Test2": "128.0.0.0"}
row = 1
for name in users:
    user_button = Tkinter.Button(self.root, text=name,
                                 command=lambda: self.a(name))
    user_button.grid(row=row, column=0)
    row += 1

這裡的目的是為每個使用者建立具有唯一參數值的按鈕。但是,在執行時,所有按鈕都會使用最後分配的 name 值來呼叫 a() 方法,從而導致每個按鈕列印「Test2」。

要解決此問題,您可以利用拉姆達表達式。透過將name 的目前值指派給新參數,您可以為每次迭代建立一個唯一的函數:

user_button = Tkinter.Button(self.root, text=name,
                             command=lambda name=name: self.a(name))

這可確保每個按鈕都有自己的lambda 函數實例以及對應的name 參數。因此,按鈕將使用其預期參數正確呼叫 a() 方法。

以上是在 Tkinter For 迴圈中指派按鈕指令時如何避免 Lambda 閉包問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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