[python-win32] How to correctly handle events using win32com ?

David Sansom david at elkpoint.co.uk
Sat Nov 30 05:04:52 EST 2024


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_abrial at 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 at python.org
> https://mail.python.org/mailman/listinfo/python-win32
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.python.org/pipermail/python-win32/attachments/20241130/7f6de6ef/attachment.html>


More information about the python-win32 mailing list