【发布时间】:2021-05-27 13:57:58
【问题描述】:
在将一组按钮中的多个单击信号连接到带有参数的单个槽函数时,我遇到了信号槽问题。
lambda 和functools.partial 可以如下使用:
user = "user"
button.clicked.connect(lambda: calluser(name))
from functools import partial
user = "user"
button.clicked.connect(partial(calluser, name))
虽然在某些情况下,它们的表现不同。
以下代码显示了一个示例,该示例希望在单击每个按钮时打印它的文本。
但使用lambda 方法时,输出始终为“按钮3”。 partial 方法符合我们的预期。
我怎样才能找到它们的不同之处?
from PyQt5 import QtWidgets
class Program(QtWidgets.QWidget):
def __init__(self):
super(Program, self).__init__()
self.button_1 = QtWidgets.QPushButton('button 1', self)
self.button_2 = QtWidgets.QPushButton('button 2', self)
self.button_3 = QtWidgets.QPushButton('button 3', self)
from functools import partial
for n in range(3):
bh = eval("self.button_{}".format(n+1))
# lambda method : always print `button 3`
# bh.clicked.connect(lambda: self.printtext(n+1))
bh.clicked.connect(partial(self.printtext, n+1))
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.button_1)
layout.addWidget(self.button_2)
layout.addWidget(self.button_3)
def printtext(self, n):
print("button {}".format(n));
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = Program()
window.show()
sys.exit(app.exec_())
附言
就我个人而言,我同意接受答案中的 ButtonGroup 方法是解决此类问题的正确和优雅的解决方案。
这里有一些关于这个问题的参考资料:
【问题讨论】:
-
@musicamante 如果您不确定您的参考是否回答了这个问题,为什么要针对这个问题发起
Close。回到你的参考,它总结了lambda作为实例方法,而partial作为静态方法,它没有解释代码的输出。 -
这是 StackOverflow 在投票结束后立即创建的自动评论,您可能不同意或者我可能错了,只需回答“不,它没有”。
标签: python lambda pyqt5 signals-slots partial