1

ActiveX dllからcomオブジェクトを動的に作成する必要があり、各オブジェクトはイベントハンドラーで処理する必要のあるイベントを発生させる可能性があります。

これは簡単に行うことができwin32com.client.Dispatchwin32com.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を「装飾」するために使用できますか?

4

2 に答える 2

0

これは、クラスインスタンスではなくクラスオブジェクトで渡さなければならないwin32comのイベント処理の大きな欠陥です。

win32comを使用してクラスに状態をアタッチできますが、次を使用して動的にクラスを作成しますnew.classobj

from win32com.client import Dispatch, WithEvents
from new import classobj

class MyEventHandler(object):
    def OnVisible(self, visible):
        print "got event from object %d" % self.obj_index

listOfObjects = []
for i in range(3):
    handler = classobj('Handler_%s' % i,(MyEventHandler,),{})
    handler.obj_index = i
    ie = Dispatch("InternetExplorer.Application")
    listOfObjects.append(ie)
    WithEvents(ie, handler)

listOfObjects[0].Visible = 1
listOfObjects[2].Visible = 1

出力:

got event from object 0
got event from object 2

これをより適切な方法で実行したい場合は、comtypesモジュール(イベント処理を参照)を調べることをお勧めします。

于 2010-01-05T06:35:00.177 に答える