【PyQt5】connect时可以为槽函数传递参数的方法

  • Post author:
  • Post category:其他


本文参考

【PyQt5】为槽函数传递额外参数的方法 – 简书

如题,一般在使用connect时若在槽函数中添加参数,在运行时会报错:unexpected type ‘NoneType’。在csdn中搜了好久都没搜到解决方法,于是特意将方法搬到这里来。

首先给出我出现问题的代码:

 def pre_port_open(self, portname, comboBox, timer_rev_list):
        portname.port = comboBox.currentText()
        portname.baudrate = 19200
        portname.bytesize = 8
        portname.stopbits = 1
        portname.parity = serial.PARITY_NONE
        if comboBox.currentText() != "":
            try:
                portname.open()
                portname.flushInput()
            except:
                QMessageBox.critical(self, "Port Error", "串口打开失败!")
                return None
        timer_rev_list.timeout.connect(self.data_receive(portname)) # 问题出在这里
        timer_rev_list.start(2)

    def data_receive(self, port):
        try:
            num = port.inWaiting()
        except:
            self.port_close()
            return None
        if num > 0:
            data = port.read(num)
            num = len(data)
            out_s = ''
            for i in range(0, len(data)):
                out_s = out_s + '{:02X}'.format(data[i]) + ' '
            self.zhongliang1.setText(out_s)

我想的是在打开串口的同时将接收数据的函数data_receive作为槽函数对一个QTimer的实例进行connect,但是这个函数需要传入串口作为参数,这里我是写的错误方法,将参数直接传入:

timer_rev_list.timeout.connect(self.data_receive(portname))

结果界面倒是可以打开运行,但是在进行串口连接的操作时会直接报错:

TypeError: argument 1 has unexpected type 'NoneType'

报错原因,简单来说就是,没有带参数的槽函数为connect传递的是该函数的地址,而带了参数的槽函数会直接将函数的运行结果传递出去,因此会出现TypeError。具体的原理在文首给出的参考链接里面有详细介绍

解决方法参考文首的链接,共有两种

1.

使用lambda匿名表达式

timer_rev_list.timeout.connect(lambda: self.data_receive(portname))

2.

使用partial偏函数方式(

需要导入functools模块

)

timer_rev_list.timeout.connect(partial(self.data_receive, portname))



版权声明:本文为laboratory461原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。