2

以下のコードは正常に動作します。from にいくつかの引数を渡したり、 fromEventHandlerのメソッドを呼び出したりする方法が見つかりません。たとえば、定数を使用する代わりに、コンストラクターまたはセッター メソッドを介して渡したいと思います。ここからの推奨事項を試しました。ただし、この場合、インスタンスはイベントをキャッチしません (または、少なくとも stdout には何も表示されません)。MainClassEventHandlerparamEventHandler

class EventHandler:
    param = "value"    
    def OnConnected(self):
        print 'connected'
        return True

class MainClass:
    def run(self):
        pythoncom.CoInitialize()
        session = win32com.client.Dispatch("Lib.Obj")
        session_id = pythoncom.CoMarshalInterThreadInterfaceInStream(pythoncom.IID_IDispatch, session)
        args = { 's_id': session_id, }
        thread = threading.Thread(target=self.run_in_thread, kwargs=args)
        thread.start()

    def run_in_thread(self, s_id):
        pythoncom.CoInitialize()
        session = win32com.client.DispatchWithEvent(
            pythoncom.CoGetInterfaceAndReleaseStream(s_id, pythoncom.IID_IDispatch),
            EventHandler
        )
        session.connect()
        while True:
            pythoncom.PumpWaitingMessages()
            time.sleep(1)

if __name__ == '__main__':
    obj = MainClass()
    obj.run() 
4

1 に答える 1

3

1 つの可能性は、WithEvents関数を使用することです。しかし、これは最善の方法ではないかもしれません。また、現在handlerclientオブジェクトは異なるエンティティであるため、オブジェクト間の相互作用のメカニズムが追加されています。

class EventHandler:

    def set_params(self, client):
        self.client = client

    def OnConnected(self):
        print  "connected!"
        self.client.do_something()
        return True

client = win32com.client.Dispatch("Lib.Obj")
handler = win32com.client.WithEvents(client, EventHandler)
handler.set_client(client)

client.connect()

while True:
    PumpWaitingMessages()
    time.sleep(1)

完全な例を次に示します。

于 2015-10-19T10:48:10.670 に答える