我将三个按钮连接到一个函数,该函数接受一个参数并简单地打印它。这些按钮以表面上不同的方式传递参数,正如您在下面的 MWE 中看到的那样,但据我所知,没有任何语义差异。
from PyQt5.QtWidgets import QPushButton, QFrame, QApplication, QVBoxLayout
from functools import partial
def func(i):
print(i)
app = QApplication([])
frame = QFrame()
layout = QVBoxLayout()
frame.setLayout(layout)
b1 = QPushButton('button 1', frame)
b1.clicked.connect(lambda: func(1))
b2 = QPushButton('button 2', frame)
b2.clicked.connect(partial(func, i=2))
b3 = QPushButton('button 3', frame)
b3.clicked.connect(lambda x=3: func(x))
layout.addWidget(b1)
layout.addWidget(b2)
layout.addWidget(b3)
frame.show()
app.exec()
因此,当我单击按钮 1 到 3 时,我希望看到
1
2
3
但是我得到了
1
2
False
最后一个 lambda 有什么问题?这可能是 PyQt 的一个错误吗?
PyQt 版本是 5.15.2。
最佳答案
我相信这是因为 PyQt 正在向 connect 函数传递一个参数。来自 documentation for QAbstractButton
,QPushButton
继承自它,clicked
槽(PyQt 中信号的回调称为槽)将接收一个 checked
参数,该参数是一个 bool 值。 lambda 函数 lambda x=3: func(x)
采用一个参数 x
,该参数采用默认值 3。如果没有参数传递到此槽,则 因此,x
将采用值 3。但是,PyQt 将 False
传递给此函数,如 clicked
信号文档中所指定,因此 x
相反,采用值 False
。
关于python - 这个 lambda 有什么问题(也许与 PyQt 有关?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65396532/