使用pywin32注册事件回调

时间:2014-06-28 22:05:28

标签: python com pywin32

我很难弄清楚如何使用pywin32接收事件。我已经创建了代码来进行一些OPC处理。根据gen_py文件夹中生成的绑定,我应该能够注册事件处理程序,它给了我应该使用的原型...例如:

# Event Handlers
# If you create handlers, they should have the following prototypes:
#   def OnAsyncWriteComplete(.......)

所以我编写的代码实现了我感兴趣的处理程序,但是没有任何想法如何将它们附加到我的客户端,并且似乎找不到对我有意义的示例。下面我创建我的客户端,然后添加一个应该有与之关联的事件的对象......

self.server = win32com.client.gencache.EnsureDispatch(driver)
# I can now call the methods on the server object like so....
new_group = self.server.OPCGroups.Add(group)

我想将我的处理程序附加到new_group对象(也许是对于self.server?)但我似乎无法理解我应该如何做到这一点。

所以我的问题是:

  1. 如何附加事件的处理程序代码?我应该看看周围的任何例子吗?
  2. 处理程序代码是否可以访问存储在客户端上的属性" self"在这种情况下?
  3. 非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

经过一段时间后,我能够找到一种方法来做到这一点。我所做的是发现我可以将我的事件处理程序类附加到该组。

self.server = win32com.client.gencache.EnsureDispatch(driver)
# I can now call the methods on the server object like so....
new_group = self.server.OPCGroups.Add(group)

self._events[group] = win32com.client.WithEvents(
    new_group, GroupEvent)

一旦我开始这样做似乎会触发事件,但事件直到脚本结束才会运行。为了让它处理排队的事件,我调用它似乎触发回调执行。

pythoncom.PumpWaitingMessages()

不知道它是否会对其他人有所帮助,但它似乎对我正在做的事情起作用。

答案 1 :(得分:0)

非常感谢,这非常有帮助。为了扩展这个问题,我发现我可以简单地注册驱动程序:

import win32com

class MyEvents(object): pass

server=win32com.client.gencache.EnsureDispatch(driver)
win32com.client.WithDispatch(server, MyEvents)

我通过执行help(win32com.client.WithEvents)

发现了这一点