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 шт):
Нельзя обращаться из дополнительного потока к объектам основного потока !
Надо использовать сигналы и слоты.
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_())
