взаимодействовать с диалоговым окном ОС, избегая блокировки процесса - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть класс для взаимодействия с windows приложением (для взаимодействия используется COM-оболочка win32). В определенное время он запускает диалоговое окно, которое блокирует основной процесс.

Это окно должно обрабатываться одним из методов в классе, а затем закрываться.

Я хотел бы сделать все элементы управления из одного и того же процесса, чтобы избежать запуска отдельного сценария python для обработки окна.

Пробовал несколько вариантов asyn c -aait, но ни один работал (один из примеров ниже). В любом случае вызов диалогового окна все еще блокирует процесс.

import asyncio

class AsyncClicker:
    async def __aenter__(self):
        return self

    async def __aexit__(self, *args, **kwargs):
        return

    async def click_upload(self):
        #reconnect to app in other thread(?)
        session = win32com.client.GetObject("App")

        # next line will block the process
        session.findById("DialogButtonID").press()
        return

class xApp:
    def __init__(self):
        session = win32com.client.GetObject("App")

        # async handlers
        self.clicker = AsyncClicker()
        self.loop = asyncio.get_event_loop()

    def multi_input_from_text(self):
        self.loop.run_forever(self.__async_click_text_input())
        # some interactions with dialog window
        self.loop.stop()

    async def __async_click_text_input(self):
        #interactions with app
        async with self.clicker as echo:
            await echo.click_upload()
            return


#app interactions
app = xApp()

app.multi_input_from_text()
...