首頁  >  文章  >  後端開發  >  為什麼我的 PyQt4 按鈕在循環連接時都會列印相同的值?

為什麼我的 PyQt4 按鈕在循環連接時都會列印相同的值?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-11 17:22:03498瀏覽

Why Do My PyQt4 Buttons All Print the Same Value When Connected in a Loop?

循環連接PyQt4 中的槽和訊號:打破綁定鏈

在本文中,我們解決了連接時遇到的常見問題來自PyQt4 循環內所建立的按鈕的clicked() 訊號。我們的目標是理解為什麼所有按鈕都會列印相同的值,儘管我們期望每個按鈕都應該根據其標籤觸發唯一的操作。

理解範圍和閉包

在提供的範例中觀察到的行為是 Python 的作用域和閉包機制的結果。在循環內建立按鈕時,我們嘗試將其 clicked() 訊號連接到 lambda 函數。然而,Python 僅透過函數的賦值或參數列表在命名空間中引入新的綁定。

因此,lambda 函數沒有自己的循環變數 i 的綁定,而是在封閉函數 __init__()。在執行 lambda 時,i 已被指派其最終值 9,導致所有按鈕列印出相同的輸出。

解決方案

要解決這個問題,我們可以將 i 作為帶有預設值的關鍵字參數傳遞給 lambda 函數。這確保了 lambda 中的 i 獨立於 __init__() 中的 i。或者,我們可以使用 functools.partial 函數,它提供了一種更具可讀性且不那麼「神奇」的方法來實現相同的結果。

有關鍵字參數的範例:

self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))

functools.partial 範例:

self._numberButtons[i].clicked.connect(partial(self._number, i))

通過實現其中一種方法,我們可以成功地在每個按鈕及其各自的操作之間建立所需的綁定。

以上是為什麼我的 PyQt4 按鈕在循環連接時都會列印相同的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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