鍍金池/ 問(wèn)答/Python  網(wǎng)絡(luò)安全/ 為什么PyQt5 循環(huán)中函數(shù)傳入?yún)?shù)總是最后一個(gè) i 值?

為什么PyQt5 循環(huán)中函數(shù)傳入?yún)?shù)總是最后一個(gè) i 值?

關(guān)鍵代碼如下:

class Example(QWidget):

    def __init__(self):

        super().__init__()
        self.initUI()

    def initUI(self):

        self.setGeometry(300, 300, 500, 800)
        self.setWindowTitle('Caculation')
        # self.setWindowIcon(QIcon('xdbcb8.ico'))
        self.resultText = QLineEdit('0', self)
        self.resultText.setGeometry(20, 30, 400, 50)
        self.resultText.setEnabled(False)

        for i in range(3):
            for j in range(3):
                num = i * 3 + j + 1
                btn_num = QPushButton(str(num), self)
                btn_num.setGeometry(50 + j * 50, 150 + i * 50, 70, 30)
                print(num)
                btn_num.clicked.connect(lambda: self.showMessage(num))

        self.show()

    def showMessage(self, num):
        print(':' + str(num))
        self.resultText.setText(str(num))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

問(wèn)題就是 showMessage函數(shù)輸出的 num 變量總是9,需要的效果根據(jù)不同的按鈕輸出不同的數(shù)字。

回答
編輯回答
兔囡囡

因?yàn)閘ambda匿名函數(shù)(或稱閉包)傳遞的是num的地址,最后你的num的值都是9,參考https://www.liaoxuefeng.com/w...

解決方法改用偏函數(shù)

from functools import partial
btn_num.clicked.connect(partial(self.showMessage, num))  # 實(shí)時(shí)傳遞數(shù)值

2018年3月14日 08:29