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.Nickch
变量的作用是什么?看看为什么要使用partial
和lambda
?ekhumoro-你是对的,lambda是完全多余的。我想我只是从问题中抽出一句话来修改它,而不是重写它。我现在改变了答案。