Python:“PyQt5.QtCore.pyqtSignal”对象没有属性“连接”

Posted

技术标签:

【中文标题】Python:“PyQt5.QtCore.pyqtSignal”对象没有属性“连接”【英文标题】:Python: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect' 【发布时间】:2018-06-14 14:32:03 【问题描述】:

我遇到了一个 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 是在文档中指定的类级别上定义的。

谢谢!

【问题讨论】:

你需要创建一个CALCULS_AE的实例。 【参考方案1】:

您有以下错误:

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

1234563 /p>

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

不正确

[...].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 提示比代码更重要,因为如果您遵循它们,您将不会再遇到相同类型的问题。 明白了!认为没有必要声明 Calcul 对象,因为我只在一个函数中调用它。我可能需要再次阅读文档;)【参考方案2】:

也许您需要从QtCore 类继承?

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

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

    ...

【讨论】:

以上是关于Python:“PyQt5.QtCore.pyqtSignal”对象没有属性“连接”的主要内容,如果未能解决你的问题,请参考以下文章

Python代写,Python作业代写,代写Python,代做Python

Python开发

Python,python,python

Python 介绍

Python学习之认识python

python初识