PyQt5 python 3 _Как из не главного класса использовать виджеты интерфейса

Есть gui собранный в pyqt5 в отдельном файле. В главном файле его импортирую и инициализирую в основном классе class mywindow(QtWidgets.QMainWindow):. В основном классе много функций, во все них взаимодействовать с интерфейсом могу.

Но одна функция слишком тормознутая и при ее запуске прога подвисает на 10сек. Вот ее я кинул в другой класс class Class_2(QThread): для запуска в отдельном потоке.

Проблему с подвисанием это решило, но появилась другая проблема - я не могу вывести результаты в виджет textEdit основного интерфейса программы. Как это реализовать?

from PyQt5 import QtCore, QtGui, QtWidgets, Qt
from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QLabel, QApplication)
from PyQt5.QtCore import QThread
from ad_gui import Ui_MainWindow
import sys
class mywindow(QtWidgets.QMainWindow):

   def __init__(self):      
       super(mywindow, self).__init__()
       self.ui = Ui_MainWindow()
       self.ui.setupUi(self)
       self.ui.pushButton_1.clicked.connect(self.open_class_2)
   def open_class_2(self):
       self.a=Class_2(self)
       self.a.start()
   def write_text_3_class_2(self, result):
       self.ui.textEdit_3.append(result)
class Class_2(QThread):
   def __init__(self, parent=None):
       super(Class_2, self).__init__()  
   def run(self):
       ...
       resultat='какой-то текст'
       mywindow().write_text_3_class_2(result=resultat)
app = QtWidgets.QApplication([])
app.setStyle('fusion')
application = mywindow()
application.show()

sys.exit(app.exec())

Ответы (1 шт):

Автор решения: S. Nick

Нельзя обращаться из дополнительного потока к объектам основного потока !

Надо использовать сигналы и слоты.

from PyQt5 import QtCore, QtGui, QtWidgets, Qt
from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QLabel, QApplication)
from PyQt5.QtCore import QThread
from PyQt5.Qt import *

#from ad_gui import Ui_MainWindow


class Class_2(QThread):
    my_singal = pyqtSignal(str)                            # +++

    def __init__(self, parent=None):
        QThread.__init__(self, parent)
        self.i = 1

    def run(self):
        #...
        while self.i < 10:
            resultat = f'какой-то текст -> {self.i}'
            self.my_singal.emit(resultat)                 # +++
            self.msleep(1000)
            self.i += 1

#       mywindow().write_text_3_class_2(result=resultat)


class MyWindow(QtWidgets.QMainWindow):
    def __init__(self):      
        super(MyWindow, self).__init__()
#       self.ui = Ui_MainWindow()
#       self.ui.setupUi(self)

        self.textEdit_3 = QTextEdit()

        self.pushButton_1 = QPushButton('Button')
        self.pushButton_1.clicked.connect(self.open_class_2)

        self.centralwidget = QWidget()
        self.setCentralWidget(self.centralwidget)

        layout = QVBoxLayout(self.centralwidget)
        layout.addWidget(self.textEdit_3)
        layout.addWidget(self.pushButton_1)

    def open_class_2(self):
        self.a = Class_2(self)
        self.a.my_singal.connect(self.write_text_3_class_2)             # +++
        self.a.start()

    def write_text_3_class_2(self, result):
        self.textEdit_3.append(result)


if __name__=="__main__":
    import sys
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка