pyqt连接到functools.partail传递信号值

时间:2017-04-04 11:40:24

标签: python lambda pyqt pyside functools

在将参数连接到GUI Qt信号时,使用functools.partial()将参数传递给函数时遇到了一些问题(log_this()是一个虚函数,只是为了传达问题):

self.ui.comboBox_1.currentIndexChanged.connect(functools.partial(self.log_this, val='aaaaaa'))

def log_this(self, val='0000'):
    log.info(val)

得到错误:

  

TypeError:log_this()为参数' val'

获取了多个值

如果我使用lambda调用该函数它可以正常工作:

self.ui.comboBox_1.currentIndexChanged.connect(lambda: self.log_this(val='aaaaaa'))

调查这个,我看到log_this()正在获取当前的comboBox索引。我也尝试过使用位置参数,并且还得到了如上所述的错误。

我想了解使用functools.partial()是否正确,或者我应该在这种情况下坚持使用lambda。如果正确的话,做正确的方法是什么?

添加更多详情:

我的班级:

class AppMainWindow(QtGui.QMainWindow):
    message = QtCore.Signal(str)

    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.manual_test = True
        self.all_tests_enabled = False
        self.set_connections()

    def set_connections(self): 
        self.ui.comboBox_1.currentIndexChanged.connect(
            functools.partial(self.log_this, val='aaaaaa'))
        self.ui.pushButton_1.clicked.connect(self.add_item)

    def log_this(self, val='0000'):
        log.info(val)

我正在使用PySide 1.2.2。

提前致谢!

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为currentIndexChanged会发出一个值(可能是新索引),您的方法会将其作为val。你有多种选择:

  • 将其连接到lambda _idx: self.log_this('aaaaaa')
  • 之类的内容
  • 使用currentIndexChanged[()].connect(...)获取没有参数的信号版本 - 这应该适用于PyQt5,我不了解PySide。
  • _idx
  • 之前将log_this等位置参数添加到val