首頁 >後端開發 >Python教學 >如何在 PyQt4 中動態連線槽和訊號而不會出現意外行為?

如何在 PyQt4 中動態連線槽和訊號而不會出現意外行為?

DDD
DDD原創
2024-11-11 19:50:03855瀏覽

How to Connect Slots and Signals Dynamically in PyQt4 Without Unexpected Behavior?

在PyQt4 中動態連接槽和訊號

在PyQt4 中,以程式設計方式將多個槽連接到訊號在循環內完成時可能會導致意外行為.

問題:

考慮創建一個帶有循環內動態產生的數字按鈕的計算器。如果每個按鈕的'clicked()'訊號連接如下:

def __init__(self):
    for i in range(0, 10):
        self._numberButtons += [QPushButton(str(i), self)]
        self.connect(self._numberButtons[i], SIGNAL('clicked()'), lambda : self._number(i))

問題:

當任何一個按鈕被點擊時,它們都會列印'9 '。這種行為源自於 Python 的作用域和閉包語意。 lambda 表達式引用變數 i,該變數在循環內計算為最終值「9」。

解決方案:

要避免此問題,請傳遞i作為具有預設值的關鍵字參數:

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

或者,使用functools.partial 以獲得更簡潔的方法:

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

這些解決方案將lambda 表達式中的i 隔離,確保每個單擊按鈕時會觸發其預期操作。

以上是如何在 PyQt4 中動態連線槽和訊號而不會出現意外行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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