python - 这个 lambda 有什么问题(也许与 PyQt 有关?)

标签 python python-3.x pyqt5

我将三个按钮连接到一个函数,该函数接受一个参数并简单地打印它。这些按钮以表面上不同的方式传递参数,正如您在下面的 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 QAbstractButtonQPushButton 继承自它,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/

相关文章:

python - 如何使用 matplotlib 制作包含多个数据的条形图

python - tkinter 在 python 中渲染错误的 RGB 阴影

python - QSound 在对象内部的意外行为

python - 在拖放中保留 QStandardItem 子类

python-3.x - PyQt5 stub 文件

python - 如何在 python 中将对象作为命令行参数传递?

python - Pandas DataFrame 中的字典嵌套列表

python - raw_input 的 if、elif、else 响应存在问题

python - Discord.py 如何获取最后一条消息并在没有任何前缀/命令的情况下回复它

python - 如何在 Python 3 中使用过滤器、映射和归约