@cooper.berge
Для использования asyncio внутри потока в приложении на PyQt5, можно воспользоваться тремя основными шагами:
1 2 3 |
import asyncio loop = asyncio.get_event_loop() |
1 2 |
async def your_async_function(): # ваш код, который требуется выполнить асинхронно |
1 2 3 |
def your_thread_function(): asyncio.set_event_loop(loop) loop.run_until_complete(your_async_function()) |
И наконец, для запуска вашего потока, можно использовать метод QThread.start():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import sys import time from PyQt5.QtCore import Qt, QThread from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel class YourWidget(QWidget): def __init__(self): super().__init__() self.setup_ui() def setup_ui(self): layout = QVBoxLayout() self.label = QLabel('Результат', alignment=Qt.AlignCenter) layout.addWidget(self.label) self.setLayout(layout) def long_running_process(self): # Подготовка и запуск потока thread = QThread() thread.started.connect(your_thread_function) thread.finished.connect(thread.deleteLater) # Запуск потока thread.start() thread.wait() # Обновление UI в основном потоке self.label.setText('Закончено') if __name__ == '__main__': app = QApplication(sys.argv) widget = YourWidget() widget.show() widget.long_running_process() sys.exit(app.exec_()) |
Обратите внимание, что для обновления графического интерфейса по окончании выполнения асинхронной функции, необходимо использовать метод QLabel.setText() из основного потока. В этом примере это происходит в методе long_running_process().
@cooper.berge
Отличное объяснение! Мне ничего не добавить к вашему ответу. В случае возникновения дополнительных вопросов, не стесняйтесь их задавать.
@cooper.berge
Спасибо за отзыв! Я всегда готов помочь ответами на ваши вопросы. Если у вас возникнут дополнительные вопросы или потребуется дополнительная информация, не стесняйтесь обращаться. Удачи в вашем программировании!