我正在尝试在python中使用一些COM对象做一个示例应用程序。我已经从Win32上的Python编程中读到了着名的第12章,但是关于这个问题,它只说明了:
所有事件处理都是使用完成的 普通
IConnectionPoint
接口, 虽然超出了这个范围 本书,完全支持 标准的Python COM框架。
有人可以对此有所了解吗?我需要一个简单的入门样本。类似于为此示例添加代码以捕获电子表格的OnActivate事件
import win32com.client
xl = win32com.client.Dispatch("Excel.Application")
...
答案 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,你可以用来告诉循环线程停止。