7

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

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

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

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

1 回答 1

6

我没有自动化 Excel,但我正在使用 Microsoft语音 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;shutdown_down 变量是一个 threading.Event,您可以使用它来告诉循环线程停止。

于 2009-08-07T12:46:03.830 回答