我需要从 activex dll 动态创建 com 对象,并且每个对象都可以引发应该由事件处理程序处理的事件。
我可以很容易地做到这一点,win32com.client.Dispatch
并将win32com.client.WithEvents
一个“单独的”事件处理程序类与每个对象关联起来。像这样:
class evt_1:
def OnEvent(self):
print "got event from object 1"
class evt_2:
def OnEvent(self):
print "got event from object 2"
obj_1 = win32com.client.Dispatch("mycom")
ev_1 = win32com.client.WithEvents(obj_1, evt_1)
obj_2 = win32com.client.Dispatch("mycom")
ev_1 = win32com.client.WithEvents(obj_2, evt_2)
但是如果我动态创建对象,让我们在一个列表中说:
listOfObjects = []
for i in range(10):
obj = win32com.client.Dispatch("mycom")
listOfObjects.append(obj)
ev = win32com.client.WithEvents(obj, MyEventHandlerClass)
我只想编写一次事件处理程序,因为直到运行时我才知道要创建多少个对象。而且我不知道如何从事件处理程序内部获取引发事件的对象。
在 VB 6 中,我使用了使用控件数组的 activex 控件,事件处理程序只需获取引发事件的控件的“索引”值。
你认为在 python 中可以做类似的事情吗?
我不确定 python 装饰器的作用是什么,但它们可以用来为 com 对象的每个索引“装饰” MyEventHandlerClass 吗?