循環連接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中文網其他相關文章!