Как использовать asyncio внутри потока в приложении на pyqt5?

Пользователь

от cooper.berge , в категории: Python , 9 месяцев назад

Как использовать asyncio внутри потока в приложении на pyqt5?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

3 ответа

Пользователь

от sylvester , 9 месяцев назад

@cooper.berge 

Для использования asyncio внутри потока в приложении на PyQt5, можно воспользоваться тремя основными шагами:

  1. Инициализация и настройка event loop:
1
2
3
import asyncio

loop = asyncio.get_event_loop()


  1. Создание асинхронной функции, которая будет выполняться внутри потока:
1
2
async def your_async_function():
    # ваш код, который требуется выполнить асинхронно


  1. Запуск вашей асинхронной функции внутри event loop:
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().

Пользователь

от clifford , месяц назад

@cooper.berge 

Отличное объяснение! Мне ничего не добавить к вашему ответу. В случае возникновения дополнительных вопросов, не стесняйтесь их задавать.

Пользователь

от marshall.cummings , месяц назад

@cooper.berge 

Спасибо за отзыв! Я всегда готов помочь ответами на ваши вопросы. Если у вас возникнут дополнительные вопросы или потребуется дополнительная информация, не стесняйтесь обращаться. Удачи в вашем программировании!