Python QTableWidget中QPushButtons的Lambda插槽

Python QTableWidget中QPushButtons的Lambda插槽,python,pyqt,Python,Pyqt,我在QTableWidget中有许多QPushButtons: from PyQt5 import QtWidgets import sys class Mainwindow(QtWidgets.QWidget): def __init__(self): super().__init__() table = QtWidgets.QTableWidget(3, 1) l = QtWidgets.QHBoxLayout()

我在
QTableWidget
中有许多
QPushButton
s:

from PyQt5 import QtWidgets
import sys

class Mainwindow(QtWidgets.QWidget):

    def __init__(self):
        super().__init__()
        table = QtWidgets.QTableWidget(3, 1)
        l = QtWidgets.QHBoxLayout()
        l.addWidget(table)
        self.setLayout(l)
        for i in range(3):
            btn = QtWidgets.QPushButton('button '+str(i))
            btn.clicked.connect(lambda: self.btnSlot(i))
            layout = QtWidgets.QHBoxLayout()
            layout.setContentsMargins(0,0,0,0)
            container = QtWidgets.QWidget()
            container.setLayout(layout)
            layout.addWidget(btn)
            table.setCellWidget(i, 0, container)

    def btnSlot(self, num):
        print(num)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    m = Mainwindow()
    m.show()
    app.exec()
为什么不管我按哪个按钮,这段代码都要打印

我希望
按钮0
打印
0
按钮1
打印
1
等,因为我用循环计数器
I
连接到lambda函数


我必须更改什么才能获得我期望的行为?

它不起作用,因为我作为参数传递给btnSlot的值是在调用btnSlot时计算的,而不是在定义lambda时计算的。需要使用分部函数冻结i的值,因此:

from functools import partial

btn.clicked.connect(partial(self.btnSlot,i))
另一种方法是利用以下事实:默认参数是在定义函数时计算的,而不是在调用时。因此:

btn.clicked.connect(lambda checked,num=i: self.btnSlot(num))

bcoz最后,
i
的val为2。将
btn.clicked.connect(lambda:self.btnSlot(i))
更改为
btn.clicked.connect(lambda ch,i=i:self.btnSlot(i))
@S.Nick Yup,有效。回答。@S.Nick
ch
变量的作用是什么?看看为什么要使用
partial
lambda
?ekhumoro-你是对的,lambda是完全多余的。我想我只是从问题中抽出一句话来修改它,而不是重写它。我现在改变了答案。