【发布时间】:2010-01-04 08:22:23
【问题描述】:
我需要从 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 吗?
【问题讨论】: