Есть ли способ подружить pyqt и asyncio?
Задача: из gui сделать две кнопки - старт и стоп сервера. Код сервера запускается из QThread. Сделан на async/await. По отдельности все ок. Вместе не получается.
#MainWindowQT def btn_start(self): today = datetime.datetime.today() self.label_4.show() self.label_5.hide() self.btnStart.setDisabled(True) self.btnStop.setEnabled(True) self.serverThread.start() self.textBrowser.append(str(today.strftime("%Y-%m-%d %H:%M:%S ") + 'INFO Сервер запущен'))
#ThreadQT from PyQt5 import QtCore import Model.Server import asyncio class ThreadServer(QtCore.QThread): sigServ = QtCore.pyqtSignal(str) def __init__(self,parent=None): QtCore.QThread.__init__(self,parent) self.running = False def run(self): self.running = True s = Model.Server.Server() while self.running: print('1' + str(self.running)) asyncio.run(s.serverInit())#Отсюда нет возврата управления, что логично в общем то QtCore.QThread.sleep(1) print('2' + str(self.running)) s.stop() print("stop")
#Server import asyncio class Server(): def __init__(self): self.host = '127.0.0.1' self.port = '9001' async def serverInit(self): self.server = await asyncio.start_server(self.readFromServer, self.host, self.port) await self.server.serve_forever() async def readFromServer(self,reader, writer): data = await reader.read(1024) print(f'Received: {data.decode()!r}') async def stop(self): self.server.close()
Выполнение останавливается на asyncio.run(s.serverInit()). Почитал что нашел - разные loop. Рекомендуют использовать сторонние, не особо понятные мне, библиотеки (например, asyncqt).
Пробовал делать await asyncio.run(s.serverInit()) - асинхронность поднимается до запуска основного окна на QT.
Есть ли другие варианты? Особого опыта написания на питоне нет. В принципе останется вариант работы без GUI из консоли - там все ок будет, но хотелось бы с кнопочками и окном.