在Python中使用COM事件

时间:2009-08-07 12:31:54

标签: python com pywin32

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

  

所有事件处理都是使用完成的   普通IConnectionPoint接口,   虽然超出了这个范围   本书,完全支持   标准的Python COM框架。

有人可以对此有所了解吗?我需要一个简单的入门样本。类似于为此示例添加代码以捕获电子表格的OnActivate事件

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

1 个答案:

答案 0 :(得分:6)

我没有自动化Excel,但是我使用的是Microsoft Speech API中的一些代码,这些代码可能与您相似,可以帮助您入门:

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(),它会检查是否有任何事件在等待,然后调用适当的回调。

如果你想在发生这种情况时做其他事情,你必须在一个单独的线程中运行循环(参见线程模块);否则它只能位于脚本的底部。在我的例子中,我在一个单独的线程中运行它,因为我还运行了一个GUI; shutting_down变量是一个threading.Event,你可以用来告诉循环线程停止。