在PyQt中点击任意按钮时调用相同的函数
我正在尝试创建一个子表单,用来在程序中读取文件。我有多个按钮,它们基本上是在不同的文件上重复执行相同的操作。
点击一个按钮会调用一个叫“loadfiles”的函数。通过一个lambda函数传递给“loadfiles”的参数是一个字符串和一个标签。
self.btnPts.clicked.connect(lambda: self.loadfiles("PtsFile",self.label))
self.btnIll.clicked.connect(lambda: self.loadfiles("IllFile",self.label_2))
self.btnSigIll.clicked.connect(lambda: self.loadfiles("SigIll",self.label_3))
self.btn.clicked.connect(lambda: self.loadfiles("FutureFile",self.label_4)
有没有办法把所有按钮放在一起,把这些语句压缩成一句话(类似于Excel VBA中的事件)呢?
我可以把按钮放到一个列表里,然后把“clicked.connect”绑定到这个列表上,这样每次点击按钮时就能调用我的函数吗?
(我才刚开始学Python,只有两周的时间,这是我第一次在这里发问。所以请告诉我问题中提供的细节是否足够。)
更新
我通过使用部分函数成功实现了这个功能。正如我在上面提到的,我想在点击按钮时将特定的字符串和相关的标签传递给一个函数。我想以更简洁的方式做到这一点。
我使用一个字典来存储我的按钮,并用标签作为键。然后我用一个for循环来遍历这个字典。
buttons = {self.btnPts:self.label,self.btnIll:self.label_2,self.btnSigIll:self.label_3,self.btn:self.label_4}
for button in buttons:
button.clicked.connect(partial(self.loadfiles,button.objectName(),buttons[button]))
致谢:我通过这个答案找到了解决办法。在PyQt4中循环连接槽和信号
1 个回答
如果你想简单地做到这一点,你需要在标签、按钮和你发送给 self.loadfiles
的字符串之间建立某种映射关系。
比如,你可以手动快速简单地建立一个映射,如下所示:
mapping = [(self.btnPts, "PtsFile", self.label),
(self.btnIll, "IllFile", self.label_2),
(self.btnSigIll, "SigIll", self.label_3),
(self.btn, "FutureFile", self.label_4)]
你也可以自己想办法编程生成这个映射(你的问题中信息不够,我无法给出具体建议)。可能还有其他适合的格式。
然后你可以遍历这个列表,并像下面这样调用 clicked.connect
:
for button, filename, label in mapping:
button.clicked.connect(lambda filename=filename, label=label: self.loadfiles(filename,label))
注意:在 lambda 定义中,保持 filename=filename, label=label
这一部分是非常重要的。如果你不这样做,当 lambda 函数执行时,它会使用当前的 filename 和 label 的内容,而在 lambda 函数执行时(也就是按钮被点击时),这些内容总是会是循环中最后一次迭代的数据。因此,无论你点击哪个按钮,代码都会执行相同的操作。