Python: объект 'PyQt5.QtCore.pyqtSignal' не имеет атрибута 'connect'

1

У меня проблема с 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 определяются на уровне класса, как указано в документации.

Спасибо !

Теги:
multithreading
pyqt5

2 ответа

0
Лучший ответ

У вас есть следующие ошибки:

  • вы должны создать объект 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()
  • 0
    Спасибо, это сработало! И спасибо за другие советы!
  • 0
    @Clement Советы важнее, чем код, потому что, если вы будете следовать им, у вас больше не возникнет проблем такого же типа.
Показать ещё 1 комментарий
0

возможно, вам нужно наследовать класс QtCore?

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

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

    ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню