单击任何按钮时,在pyqt中调用相同的函数

时间:2014-07-29 19:53:40

标签: python python-3.x 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”绑定到它,以便它立即调用我的函数。

(我在2周前开始用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]))

信用:我能够通过这个答案工作.. Connecting slots and signals in PyQt4 in a loop

1 个答案:

答案 0 :(得分: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函数时(在按钮点击时)将始终包含循环的最后次迭代。因此,无论您点击哪个按钮,代码都会执行相同的操作。