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

Reply via email to