为什么PyQt5 循环中函数传入参数总是最后一个 i 值?

关键代码如下:

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_())

问题就是 showMessage函数输出的 num 变量总是9,需要的效果根据不同的按钮输出不同的数字。

阅读 4.1k
2 个回答

因为lambda匿名函数(或称闭包)传递的是num的地址,最后你的num的值都是9,参考https://www.liaoxuefeng.com/w...

解决方法改用偏函数

from functools import partial
btn_num.clicked.connect(partial(self.showMessage, num))  # 实时传递数值

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题