我遇到了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是在文档中指定的类级别定义的。
谢谢!
答案 0 :(得分:1)
您有以下错误:
您必须创建一个Calculs对象:self.calculs = Calculs()
如果您要使用Python的原生threading
,使用QThread
没有意义,有两个元素可以做同样的事情,所以更改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()
答案 1 :(得分:0)
也许您需要继承QtCore
班级?
from PySide import QtCore
class CALCULS_AE(QtCore.QThread):
#Signals
Uni_finished = QtCore.pyqtSignal()
Reb_finished = QtCore.pyqtSignal()
...