【问题标题】:Calling the same function in pyqt when any button is clicked单击任何按钮时在pyqt中调用相同的函数
【发布时间】:2014-07-30 10:10:20
【问题描述】:

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

按钮单击调用函数“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 循环来遍历字典。

按钮 = {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

【问题讨论】:

  • 那么您是只想拥有一个按钮还是拥有多个功能相同的按钮?
  • 嗨,我有多个按钮。我想调用相同的函数。
  • 那又怎样?成功了吗?
  • 没有。你能解释一下语法吗?我没有找到 on_clicked 函数。
  • 天哪,你必须自己定义!

标签: python python-3.x pyqt


【解决方案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 函数执行时,它将使用文件名和标签的当前内容,到执行 lambda 函数时(单击按钮)将始终包含循环的最后次迭代。因此,无论您单击哪个按钮,代码都会执行相同的操作。

【讨论】:

  • 哦...刚刚看到你在我写答案的时候解决了...哦,好吧:)
  • 太棒了!我试图使用 lambda 函数使其工作,但在尝试了近一个小时后放弃了(出于与您在注释中提到的相同原因)。非常感谢您解释 lambda'esque 的做法!
猜你喜欢
  • 2021-10-08
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 2014-01-11
  • 1970-01-01
相关资源
最近更新 更多