У меня проблема с pyqtSignal, проходящей через потоки. Я получаю следующую ошибку:
AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
по команде:
CALCULS_AE.Uni_finished.connect(self.getFinishThread())
Программа в основном представляет собой mainwindow, разработанный с помощью 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 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 определяются на уровне класса, как указано в документации.
Спасибо !
У вас есть следующие ошибки:
вы должны создать объект self.calculs = Calculs()
: self.calculs = Calculs()
Если вы собираетесь использовать родную threading
в Python не имеет смысла использовать 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()
возможно, вам нужно наследовать класс QtCore
?
from PySide import QtCore
class CALCULS_AE(QtCore.QThread):
#Signals
Uni_finished = QtCore.pyqtSignal()
Reb_finished = QtCore.pyqtSignal()
...