Потребление событий COM в Python - PullRequest
7 голосов
/ 07 августа 2009

Я пытаюсь сделать пример приложения на python, который использует некоторые объекты COM. Я прочитал знаменитую главу 12 из Python Programing на Win32, но в отношении этой проблемы он только заявляет:

Вся обработка событий выполняется с использованием нормальные IConnectionPoint интерфейсы, и хотя выходит за рамки этого книга, полностью поддерживается стандартная структура Python COM.

Кто-нибудь может пролить свет на это? Мне нужен простой стартовый образец. Что-то вроде добавления кода в этот образец, чтобы перехватить событие OnActivate для электронной таблицы

import win32com.client
xl = win32com.client.Dispatch("Excel.Application")
...

1 Ответ

6 голосов
/ 07 августа 2009

Я не автоматизировал Excel, но я использую некоторый код из Speech API от Microsoft , который может быть достаточно похожим для начала работы:

ListenerBase = win32com.client.getevents("SAPI.SpInProcRecoContext")
class Listener(ListenerBase):
    def OnRecognition(self, _1, _2, _3, Result):
        """Callback whenever something is recognized."""
        # Work with Result

    def OnHypothesis(self, _1, _2, Result):
        """Callback whenever we have a potential match."""
        # Work with Result

затем в основном цикле:

    while not self.shutting_down.is_set():
        # Trigger the event handlers if we have anything.
        pythoncom.PumpWaitingMessages() 
        time.sleep(0.1) # Don't use up all our CPU checking constantly

Изменить для более подробной информации о главном цикле:

Когда что-то происходит, обратный вызов вызывается не сразу; вместо этого вы должны вызвать PumpWaitingMessages (), которая проверяет, ожидают ли какие-либо события, а затем вызывает соответствующий обратный вызов.

Если вы хотите сделать что-то еще, пока это происходит, вам придется запустить цикл в отдельном потоке (см. Модуль потоков); в противном случае он может просто сидеть внизу вашего сценария. В моем примере я запускал его в отдельном потоке, потому что у меня также был запущен графический интерфейс; переменная shutting_down является threading.Event, который вы можете использовать, чтобы сообщить зацикливающемуся потоку об остановке.

...