LINUX.ORG.RU

pyqt и asyncio

 , ,


0

3

Есть такая библиотека написанная на asyncio - panoramisk. она слушает события. https://github.com/gawel/panoramisk/blob/master/examples/event_listener.py

@manager.register_event('*')
def callback(event, manager):
    if "FullyBooted" not in manager.event:
        """This will print every event, but the FullyBooted events as these
        will continuously spam your screen"""
        print(manager)
Как мне вместо print вызывать виджет допустим Qlabel на pyqt? так чтобы этот loop продолжался выполняться? А не завершался как только окно закрыто с этим виджетом?


В отдельном треде нужно крутить луп. Например вызвать там какойнить loop.run_until_completed(fut) И из основного треда можешь там запускать свои корутины, и завершить эту самую fut когда выходить надо.

redixin ★★★ ()
Ответ на: комментарий от redixin

У меня основным приложением должна быть эта библиотека. Т.е процесс, который слушает и получает события, а сама qt это корутина? Т.е идея такая. Запускают процесс, библиотека слушает, получает событие и показывает qt. Я правильно рассуждают?

tits ()
Ответ на: комментарий от tits

Ну или можешь запустить тред с кутишным лупом, и потом из своих колбеков создавать на нем кутишные окна. Просто нужно понимать что qt нужен луп, и asyncio нужен луп. А чтобы луп не блокировал другой луп, ему нужно быть в отдельном треде. Грубо говоря:


loop_qt = App()
loop_aio = asyncio.get_event_loop()

def thread_qt:
  loop_qt.loop()

def thread_asyncio:
  loop_aio.run_forever()

start_thread(thread_qt)
start_thread(thread_asyncio)

async def some_coro():
  loop_qt.create_window()

loop_aio.create_task(some_coro)
wait_forever()

Я не сильно понмю как готовить qt, но смысл примерно такой.

redixin ★★★ ()
Ответ на: комментарий от tits

А вообще можно сделать по-простому: запихнуть в модуль чето типа этого https://pythonspot.com/en/qt4-messagebox/ (и естественно не нужно пытаться делать там sys.exit)

и вызывать его из своих корутин через это https://docs.python.org/3/library/asyncio-eventloop.html#executor

redixin ★★★ ()