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)
実行時まで作成するオブジェクトの数がわからないため、イベントハンドラーを1回だけコーディングしたいと思います。また、イベントハンドラー内からイベントを発生させたオブジェクトを取得する方法がわかりません。
VB 6では、コントロール配列を使用してActiveXコントロールを使用しました。イベントハンドラーは、イベントを発生させたコントロールの「インデックス」値を取得するだけです。
Pythonでも同様のことができると思いますか?
Pythonデコレータがどのように機能するかはわかりませんが、comオブジェクトの各インデックスのMyEventHandlerClassを「装飾」するために使用できますか?