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

3
我正在处理一个关于pyqtSignal在线程间传递的问题。 我遇到了以下错误:
AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'

在该命令中:
 CALCULS_AE.Uni_finished.connect(self.getFinishThread())

该程序基本上是使用PyQt Designer设计的MainWindow,并通过线程调用几个不同的函数。 我想在我的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在类级别上定义。

谢谢!


你需要创建一个 CALCULS_AE 的实例。 - ekhumoro
2个回答

3
您有以下错误:
  • 您必须创建一个Calculs对象:self.calculs = Calculs()

  • 如果您要使用Python的本地threading,那么使用QThread就没有意义了,因为有2个元素可以做同样的事情,所以将QThread更改为QObject

  • 当您将信号连接到函数时,必须传递函数的名称,而不是已评估的函数。

不正确的。

[...].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()

@Clement,编程中的技巧比代码更重要,因为如果你遵循它们,你将不会再遇到同样类型的问题。 - eyllanesc
明白了!我以为只在一个函数中调用Calcul对象,所以不需要声明它。我可能需要再读一遍文档 ;) - Clement

0

也许你需要从 QtCore 类继承?

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

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

    ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接