python - 这个 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。
解决方案
我相信这是因为 PyQt 正在将参数传递给连接函数。从继承的文档中QAbstractButton
,槽(PyQt 中的信号回调称为槽)将接收一个参数,该参数是一个布尔值。lambda 函数采用一个参数,,它采用默认值 3。如果没有参数传递给此插槽,则将采用值 3。但是,PyQt 传递给此函数,如信号文档中所述,因此取而代之的是值.QPushButton
clicked
checked
lambda x=3: func(x)
x
x
False
clicked
x
False
推荐阅读
- google-data-studio - Google 数据洞察中的时间表
- c# - 合并(联合?)并简化/减少 GeoJson 的 DbGeometry 记录
- javascript - 设置 audio.playbackRate 将导致 mp3 在 iphone 中跳过
- android - Okhttp android 测量 TTFB
- c++ - 使用 getter 方法返回 std::map
- javascript - 为什么我的 PHP AJAX onclick 函数并不总是触发?
- html - 提交按钮后如何关闭模式窗口?
- sql - LEFT JOIN 从左表中获取所有行,而不考虑连接条件
- python - 通过源代码在mac中安装basemap/geos
- system-verilog - 如何使用 VPI 向 Systemverilog 关联数组添加新密钥