Thanks a lot, that explanation is very useful ! Regards, G. Téléchargez Outlook pour iOS<https://aka.ms/o0ukef> ________________________________ De : David Sansom <da...@elkpoint.co.uk> Envoyé : Saturday, November 30, 2024 2:56:02 PM À : Gauthier ABRIAL <g_abr...@hotmail.com> Cc : python-win32@python.org <python-win32@python.org> Objet : Re: [python-win32] How to correctly handle events using win32com ?
Glad it’s working! Your Python code and the Excel application are running in separate processes that (usually) only communicate via COM, not the windows messaging system. When Excel wants to quit it posts a WM_QUIT message to its OWN message queue which, once processed, will terminate the main Excel application thread’s message loop. The Excel process will then terminate (usually). Your Python code may or may not have a message loop. Calling PumpMessages() creates a message loop in your Python application’s main thread. It is there simply to stop your code running through to completion and exiting. It also allows execution of other routines in your code. You have to send a quit message to this loop yourself when you know you are done with it and you want your application to terminate. Excel doesn’t know much about your Python calling code (and certainly not whether your code has a message loop) except that your code has notified Excel (using the WithEvents() call) that it wants Excel to fire the supplied callback whenever an event occurs. Your Python code then decides if it cares about the Event, otherwise ignoring it. That is why you have to write a specific handler for OnBeforeClose and also decide what to do when the event is fired. Excel can’t decide that for you. Best DS Sent from my iPhone On 30 Nov 2024, at 17:28, Gauthier ABRIAL <g_abr...@hotmail.com> wrote: @David Sansom<mailto:da...@elkpoint.co.uk>: amazing that's exactly what I was looking for ! That works now, PumpMessages() is correctly returning when I call PostQuitMessage(). So the reason why Excel is not sending the WM_QUIT message by itself (or why PumpMessage() is not receiving it) is still unclear to me but I have a workable solution and I know that the way I use win32com seems to make sense (nobody gave me any pushback here on the way I use it). Thanks a lot everybody. G. ________________________________ De : David Sansom <da...@elkpoint.co.uk> Envoyé : 30 novembre 2024 05:04 À : Gauthier ABRIAL <g_abr...@hotmail.com> Cc : python-win32@python.org <python-win32@python.org> Objet : Re: [python-win32] How to correctly handle events using win32com ? Hi, * I guess I should send a WM_QUIT message but I don't know how. Have you tried win32api.PostQuitMessage() in the event handler for Code 1? DS Sent from my iPhone On 29 Nov 2024, at 18:00, Gauthier ABRIAL <g_abr...@hotmail.com> wrote: Hello, I'm looking for some advice on how to correctly handle events using win32com. If I take the example of a very simple Excel automation, I tested two things. * Code1 below use pythoncom.PumpMessages() but I don't know how to stop it when the Excel is closing. I guess I should send a WM_QUIT message but I don't know how. * Code2 below use a while loop on pythoncom.PumpWaitingMessages() but once I stop the loop the COM server freeze as it is waiting for the messages it sends to be processed before closing. I guess I should pump all the remaining messages but I don't know how. Maybe I should use a totally different approach. Thanks a lot for your help. G. -------------------- Code1 Starts ----------------------- import win32com.client as win32 import pythoncom #The event handlers class wbEvents: def OnBeforeClose(self, Cancel): print('Closing Workbook') # Send WM_QUIT here ? xlApp = win32.Dispatch("Excel.Application") #Open Excel xlApp.Visible=True #Make Excel Visible xlwb = xlApp.Workbooks.Add() #Create a workbook ws=xlwb.Sheets("Sheet1") #Get the first worksheet xl_events=win32.WithEvents(xlwb,wbEvents) #Add and Event handler pythoncom.PumpMessages() -------------------- Code1 Ends ----------------------- -------------------- Code2 Starts ----------------------- import win32com.client as win32 import pythoncom import time #The event handlers class wbEvents: def OnBeforeClose(self, Cancel): print('Closing Workbook') global keepOpen keepOpen = False xlApp = win32.Dispatch("Excel.Application") #Open Excel xlApp.Visible=True #Make Excel Visible xlwb = xlApp.Workbooks.Add() #Create a workbook ws=xlwb.Sheets("Sheet1") #Get the first worksheet xl_events=win32.WithEvents(xlwb,wbEvents) #Add and Event handler # define initalizer keepOpen = True while keepOpen: time.sleep(0.1) pythoncom.PumpWaitingMessages() -------------------- Code2 Ends ----------------------- _______________________________________________ python-win32 mailing list python-win32@python.org https://mail.python.org/mailman/listinfo/python-win32
_______________________________________________ python-win32 mailing list python-win32@python.org https://mail.python.org/mailman/listinfo/python-win32