在PyQt中点击任意按钮时调用相同的函数

0 投票
1 回答
2532 浏览
提问于 2025-04-18 15:14

我正在尝试创建一个子表单,用来在程序中读取文件。我有多个按钮,它们基本上是在不同的文件上重复执行相同的操作。

点击一个按钮会调用一个叫“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 个回答

0

如果你想简单地做到这一点,你需要在标签、按钮和你发送给 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 函数执行时(也就是按钮被点击时),这些内容总是会是循环中最后一次迭代的数据。因此,无论你点击哪个按钮,代码都会执行相同的操作。

撰写回答