以下代码运行正常。我无法找到将某些参数传递给EventHandler
或从MainClass
调用EventHandler
方法的方法。例如,我想通过构造函数或setter方法传递它,而不是使用常量param
。我尝试了here的推荐。但在这种情况下,EventHandler
实例不会捕获任何事件(或者至少没有任何内容出现在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()
答案 0 :(得分:2)
一种可能性是使用WithEvents
功能。但这可能不是最好的方法。现在,handler
和client
对象也是不同的实体,因此这会导致它们之间的其他交互机制。
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)