如何将参数传递给 win32com 事件处理程序 [英] How to pass arguments to win32com event handler

查看:36
本文介绍了如何将参数传递给 win32com 事件处理程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面的代码工作正常.我找不到将某些参数传递给 EventHandler 或从 EventHandler 调用 MainClass 的方法的方法.例如,我想通过构造函数或 setter 方法传递它,而不是使用常量 param.我已经尝试过此处的建议.但在这种情况下,EventHandler 实例不会捕获任何事件(或者至少没有出现在标准输出中).

The code below works fine. I can't find a way to pass some arguments to EventHandler or to call methods of MainClass from EventHandler. For example instead of using constant param, I'd like to pass it through constructor or setter method. I've tried recommendations from here. But in this case EventHandler instance does not catch any events (or at least nothing appears in stdout).

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() 

推荐答案

一种可能性是使用 WithEvents 函数.但这可能不是最好的方法.现在 handlerclient 对象是不同的实体,所以这导致了它们之间的额外交互机制.

One possibility is to use WithEvents function. But this may not be the best way. Also now handler and client objects are different entities, so this leads to additional mechanisms of interaction between them.

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)

这是完整示例.

这篇关于如何将参数传递给 win32com 事件处理程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆