Как передавать данные из дополнительного потока в основной поток?
Долго бьюсь над задачей передавать значение из дополнительного потока значение в GUI поток, изменяя GUI элемент на передаваемое значение.
Но как я не пытаюсь, программа крашится при выполнении этого действия. Притом если делать тоже самое из GUI поток, то все исправно.
GUI код отдельно, могу приложить если нужно. Тыкните пожалуйста носом, где я туплю
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QObject, pyqtSignal
import MiScanUi
import sys
class secondFlow(QtCore.QThread): # 2 поток с автозапуском метода run при старте потока
signalFromSecondFlow = QtCore.pyqtSignal(int)
def __init__(self, parent=None):
super().__init__(parent)
def run(self): #автоматически запускается при старте потока
n = 1
while n > 0:
print('поточу поточу')
n = n+1
print(n)
self.signalFromSecondFlow.emit(n)
#self.msleep(1000)
class GUImainThread(QtWidgets.QMainWindow, MiScanUi.Ui_mainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = MiScanUi.Ui_mainWindow()
self.ui.setupUi(self)
self.secondThread = secondFlow()
self.secondThread.signalFromSecondFlow.connect(self.changeText)
self.secondThread.start()
def changeText(self, text):
self.curpage_count.setText(5)
print('pololo')
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv) # Новый экземпляр QApplication
app.setStyle('Fusion')
win= GUImainThread() # Создаём объект класса GUiExampleApp
win.show() # Показываем окно
sys.exit(app.exec_()) # и запускаем приложение
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
void QLabel::setNum(int num)
Задает для содержимого метки обычный текст, содержащий текстовое представление целого числа.
Любое предыдущее содержимое очищается.
Ничего не делает, если строковое представление целого числа совпадает с текущим содержимым метки.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QObject, pyqtSignal, Qt
#import MiScanUi
class secondFlow(QtCore.QThread): # 2 поток с автозапуском метода run при старте потока
signalFromSecondFlow = QtCore.pyqtSignal(int)
def __init__(self, parent=None):
super().__init__(parent)
def run(self): # автоматически запускается при старте потока
n = 1
while n > 0:
#print('поточу поточу')
n = n + 1
#print(n)
self.signalFromSecondFlow.emit(n)
self.msleep(100)
class GUImainThread(QtWidgets.QMainWindow): # , MiScanUi.Ui_mainWindow):
def __init__(self, parent=None):
super().__init__(parent)
# self.ui = MiScanUi.Ui_mainWindow()
# self.ui.setupUi(self)
self.centralWidget = QtWidgets.QWidget()
self.centralWidget.setStyleSheet('background-color: #9EB23B;')
self.setCentralWidget(self.centralWidget)
self.curpage_count = QtWidgets.QLabel()
self.curpage_count.setStyleSheet('''
background-color: green;
color: #FFC54D;
font: 50pt \"Ubuntu\";
''')
layout = QtWidgets.QVBoxLayout(self.centralWidget)
layout.addWidget(self.curpage_count, alignment=Qt.AlignCenter)
self.secondThread = secondFlow()
self.secondThread.signalFromSecondFlow.connect(self.changeText)
self.secondThread.start()
# def changeText(self, text):
# v^v^
def changeText(self, num ): # !!! +++
# TypeError: setText(self, str): argument 1 has unexpected type 'int'
# self.curpage_count.setText(5)
self.curpage_count.setNum(num) # !!! +++
#print('pololo')
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
app.setStyle('Fusion')
win = GUImainThread()
win.show()
sys.exit(app.exec_())
