【问题标题】:PyQt generate Button-ConnectorsPyQt 生成按钮连接器
【发布时间】:2014-01-18 18:52:09
【问题描述】:

我想自动生成按钮连接...但不起作用:

    self._ = {}
    j = 0
    for i in self.btn:
        self._[i] = 'self._' + repr(j)
        print self._[i]
        self.button[i].clicked.connect(self._[i])
        j += 1

应该在函数_j ( def _1(self): / def _2(self): / ...处绑定button[i],但在执行时:

connect() slot argument should be a callable or a signal, not 'str'

如何解决?

【问题讨论】:

    标签: python button pyqt connect


    【解决方案1】:

    错误信息说明了一切,您需要传递一个函数或信号。尝试使用getattr获取字符串所代表的函数。

    这样的事情可能会奏效

    self.button[i].clicked.connect(getattr(self, '_'.format(j)))
    

    【讨论】:

    • 这个功能的Prams是什么?第一个是self,第二个是name of the function,但第三个呢?
    • 那里没有第三个参数。
    • 我有:self.button[i].clicked.connect(setattr(self, self._[i])) 错误:TypeError: setattr expected 3 arguments, got 2
    • 你写错了函数,应该是getattr,而不是setattr。那是从另一个答案。我现在进行了编辑,所以重新阅读答案。
    【解决方案2】:

    尝试创建一个实际的可调用方法,而不是将字符串发送到connect():

    def make_slot(self, i):
        print 'clicked %i' % i 
    
    self._ = {}
    for i in self.btn:
        slot = self.make_slot(i)
        self._[i] = slot
        self.button[i].clicked.connect(slot)
    

    (make_slot 函数是为了防止 python 后期绑定的怪癖,请参阅Creating functions in a loop )

    另外,也许您可​​以将插槽直接添加到 self 中,而不是构建一个 dict:

    setattr(self, 'on_button_%i_clicked' % i, slot) # perhaps more convenient?
    

    这样,如果您也需要,也可以将它们分别称为self.on_button_42_clicked。

    【讨论】:

      猜你喜欢
      • 2015-01-01
      • 2013-12-21
      • 2021-12-11
      • 2017-07-01
      • 2015-03-04
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      相关资源
      最近更新 更多