首页 > 解决方案 > 这个 lambda 有什么问题(可能与 PyQt 有关?)

问题描述

我将三个按钮连接到一个函数,该函数接受一个参数并简单地打印它。正如您在下面的 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。

标签: pythonpython-3.xpyqt5

解决方案


我相信这是因为 PyQt 正在将参数传递给连接函数。从继承的文档中QAbstractButton,槽(PyQt 中的信号回调称为槽)将接收一个参数,该参数是一个布尔值。lambda 函数采用一个参数,,它采用默认值 3。如果没有参数传递给此插槽,则将采用值 3。但是,PyQt 传递给此函数,如信号文档中所述,因此取而代之的是值.QPushButtonclickedcheckedlambda x=3: func(x)xxFalseclickedxFalse


推荐阅读