Вызов функции из другого потока
У меня есть окно PyQt5, оно существует в своем "главном" потоке.
При нажатии на кнопку в гуи, запускается второй "бэк-енд" поток(QThread), там происходит открытие файлa, с последующей обработкой данных и сохранением.
Вопрос: как можно из "бэк-енд" потока вызвать, скажем, мэссдж-бокс в гуи с ошибкой или другой информацией?
import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import QThread
from PyQt5.QtWidgets import QMessageBox
class Backend(QThread):
def __init__(self, path) -> None:
QThread.__init__(self)
self.path = path
def run(self):
# file.open(self.path)
# .......
# file.save(other.path)
print('Вызов фун-ии notifications(status)')
class MyApp(QtWidgets.QDialog):
def __init__(self) -> None:
super().__init__()
self.bc = Backend('./')
self.btn = QtWidgets.QPushButton('Начать', self)
self.setGeometry(300,400,300,150)
self.btn.clicked.connect(self.bc.start)
def notifications(self, **kwargs):
if kwargs['status'] == 'success':
QMessageBox.information(self, 'Оповещение', 'Файл преобразован и успешно сохранен!')
else:
QMessageBox.critical(self, 'Ошибка', 'Что-то пошло не так')
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
main = MyApp()
main.show()
sys.exit(app.exec_())
Заранее спасибо!
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Сигналы и слоты используются для связи между объектами. Механизм сигналов и слотов - это центральная особенность Qt и, вероятно, часть, которая больше всего отличается от функций, предоставляемых другими фреймворками.
Больше https://doc.qt.io/qt-5/signalsandslots.html
import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QMessageBox
class Backend(QThread):
mySignal = pyqtSignal(str) # !!!
def __init__(self, path) -> None:
super().__init__()
self.path = path
def run(self):
try:
# file.open(self.path)
# .......
# file.save(other.path)
self.msleep(2000) # имитируем работу 2 сек.
#2 / 0 # раскомментируйте эту строку
self.mySignal.emit('Success') # !!!
except:
self.mySignal.emit('Error') # !!!
class MyApp(QtWidgets.QDialog):
def __init__(self) -> None:
super().__init__()
self.bc = Backend('./')
self.bc.mySignal.connect(self.notifications) # !!!
self.btn = QtWidgets.QPushButton('Начать', self)
self.setGeometry(300,400,300,150)
self.btn.clicked.connect(self.bc.start)
def notifications(self, text):
if text == 'Success':
QMessageBox.information(self,
'Оповещение', 'Файл преобразован и успешно сохранен!')
else:
QMessageBox.critical(self, 'Ошибка', 'Что-то пошло не так')
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
main = MyApp()
main.show()
sys.exit(app.exec_())
