代码之家  ›  专栏  ›  技术社区  ›  Eduardo

在pyqt的for循环中连接多个信号/插槽

  •  1
  • Eduardo  · 技术社区  · 7 年前

    for loop

    # Connect Scan Callbacks
    for button in ['phase', 'etalon', 'mirror', 'gain']:
        getattr(self.ui, '{}_scan_button' .format(button)).clicked.connect(
            lambda: self.scan_callback(button))
    

    我的期望:

    • 连接按钮 phase_scan_button signal scan_callback slot 然后发送字符串 phase 狭槽 . 同样适用于 etalon mirror gain .

    我得到的是:

    • 出于某种原因,我的函数总是传递字符串 获得 作为所有按钮的参数。不确定我是愚蠢(很可能)还是一个bug。

    作为参考 狭槽 方法:

    def scan_callback(self, scan):
        print(scan) # Here I always get 'gain'
        if self.scanner.isWorking:
            self.scanner.isWorking = False
            self.scan_thread.terminate()
            self.scan_thread.wait()
        else:
            self.scanner.isWorking = True
            self.scan_thread.start()
            getattr(self.ui, '{}_scan_button' .format(
                scan)).setText('Stop Scan')
            getattr(self, '_signal{}Scan' .format(scan)).emit()
    
    3 回复  |  直到 7 年前
        1
  •  6
  •   offeltoffel    7 年前

    myButtons = [self.ui.phase_scan_button, self.ui.etalon_scan_button,
                 self.ui.mirror_scan_button, self.ui.gain_scan_button]
    for button in myButtons:
        button.clicked.connect(lambda _, b=button: self.scan_callback(scan=b))
    

    如果需要分别使用字符串“phase”、“etalon”、“mirror”和“gain”,可以将它们存储在另一个列表中,也可以创建类似于的字典

    myButtons_dict = {"phase": self.ui.phase_scan_button,
                     "etalon": self.ui.etalon_scan_button,
                     "mirror": self.ui.mirror_scan_button,
                     "gain": self.ui.gain_scan_button}
    
    for button in myButtons_dict:
        myButtons_dict[button].clicked.connect(lambda: _, b=button self.scan_callback(scan=b))
    

    注意,我如何将lambda表达式与实体变量一起使用,然后将实体变量传递到函数中 self.scan_callback button

        2
  •  2
  •   GPhilo satyendra    7 年前

    你的羔羊 价值 属于 button 但在你真正调用lambda之前不会执行 . 变量的当前值 按钮 按钮 包含 "gain"

    试试这个:

    funcs = []
    for button in ['phase', 'etalon', 'mirror', 'gain']:
        funcs.append( lambda : print(button))
    
    for fn in funcs:
      fn()
    

    gain
    gain
    gain
    gain
    

    扩展示例,作为lambda不存储 按钮 注意,如果 停止存在,将出现错误:

    del button
    for fn in funcs:
      fn()
    

    有输出

    funcs.append( lambda : print(button))
    NameError: name 'button' is not defined
    
        3
  •  0
  •   SWB    5 年前

    Connecting slots and signals in PyQt4 in a loop 使用 functools.partial 是解决这个问题的好方法。

    一天来一直在和OP一样的问题上挣扎。