Python:' PyQt5.QtCore.pyqtSignal'对象没有属性' connect'

时间:2018-06-14 14:32:04

标签: python multithreading pyqt5

我遇到了pyqtSignal通过线程的问题。 我收到以下错误:

AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'

命令:

 CALCULS_AE.Uni_finished.connect(self.getFinishThread())

该程序基本上是一个使用PyQt Designer设计的主窗口,并通过线程调用一些不同的函数。 我想在我的MainWindow代码中获得一些线程的结束信号(为了显示结果等等)。下面是解释其架构的代码的一小部分。

主要代码:

class MainWindow(QMainWindow, Ui_MainWindow):

   def __init__(self):
       #Some code...
       self.Button.clicked.connect(self.launch_Calculation_clicked)

   def launch_Calculation(self):
       AE_Uni_thread = threading.Thread(target = CALCULS_AE.Calcul_AE_Uni, args = (arg1, arg2, arg3, arg4)) # Calculs_AE is a class defined in another file
       CALCULS_AE.Uni_finished.connect(self.getFinishThread()) # Another function doing some other stuff with the thread's results
       AE_Uni_thread.start()

开始计算的类CALCULS_AE:

class CALCULS_AE(object):
 #Signals
    Uni_finished = QtCore.pyqtSignal()
    Reb_finished = QtCore.pyqtSignal()

    def __init__(self):
        # Some Code

    def Calculs_AE_Uni(self, arg1, arg2, arg3, arg4):
        # Some Code launching the calculation
        self.Uni_finished.emit()

PS:pyqtSignals是在文档中指定的类级别定义的。

谢谢!

2 个答案:

答案 0 :(得分:1)

您有以下错误:

  • 您必须创建一个Calculs对象:self.calculs = Calculs()

  • 如果您要使用Python的原生threading,使用QThread没有意义,有两个元素可以做同样的事情,所以更改QThreadQObject

  • 当您将信号连接到某个功能时,您必须传递该功能的名称,而不是已评估的功能。

不正确

[...].finished.connect(self.getFinishThread())

[...].finished.connect(self.getFinishThread)
  • target需要函数的名称,而不是评估函数。

  • 如果您不打算修改Calculs类的构造函数,则无需实现它。

代码:

class Test(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        Ui_MainWindow.__init__(self)
        self.setupUi(self)      
        self.pushButton.clicked.connect(self.Launch_Test)

    def Launch_Test(self):
        self.calculs = Calculs()
        self.calculs.finished.connect(self.getFinishThread)
        test_thread = threading.Thread(target = self.calculs.Calcul_Test)
        test_thread.start()

    def getFinishThread(self):
        print('Good ! \n')
        #os.system('pause')

class Calculs(QObject):
    finished = pyqtSignal()

    def Calcul_Test(self):
        print('Test calcul\n')
        self.finished.emit()

答案 1 :(得分:0)

也许您需要继承QtCore班级?

from PySide import QtCore
class CALCULS_AE(QtCore.QThread):

    #Signals
    Uni_finished = QtCore.pyqtSignal()
    Reb_finished = QtCore.pyqtSignal()

    ...