使用Python中的COM事件

使用Python中的COM事件,python,com,pywin32,Python,Com,Pywin32,我正在尝试用python编写一个示例应用程序,它使用一些COM对象。我已经阅读了著名的关于Win32上Python编程的第12章,但关于这个问题,它只说明: 所有事件处理都是使用 正常i连接点接口, 尽管超出了本文的范围 这本书,得到了 标准Python COM框架 有人能解释一下吗?我需要一个简单的起动器样品。类似于将代码添加到此示例以捕获电子表格的OnActivate事件 import win32com.client xl = win32com.client.Dispatch("Excel.

我正在尝试用python编写一个示例应用程序,它使用一些COM对象。我已经阅读了著名的关于Win32上Python编程的第12章,但关于这个问题,它只说明:

所有事件处理都是使用 正常
i连接点
接口, 尽管超出了本文的范围 这本书,得到了 标准Python COM框架

有人能解释一下吗?我需要一个简单的起动器样品。类似于将代码添加到此示例以捕获电子表格的OnActivate事件

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

我没有使用自动Excel,但我正在使用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
有关主循环的更多详细信息,请编辑:

    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(),它检查是否有任何事件等待,然后调用相应的回调函数


如果您想在发生这种情况时执行其他操作,则必须在单独的线程中运行循环(请参阅线程模块);否则,它可能只是位于脚本的底部。在我的示例中,我在一个单独的线程中运行它,因为我还运行了一个GUI;关闭变量是一个线程事件。您可以使用该事件通知循环线程停止。

谢谢。你能详细介绍一下第二部分(循环)吗?抱歉打扰了,我刚开始使用pyhton:)。:)我知道消息循环是什么-我似乎找不到pythoncom-这是我需要导入的包吗?另外,我看到还有一个DispatchWithEvents方法——我会在有时间讨论这个问题时进行研究;它应该随您的Python Win32 Extensions安装一起提供(安装Pythonwin等)。@Kiv有没有一种方法不必调用
time.sleep(0.1)