For some reasons the PumpWaitingMessages() is never returning 1, even if it 
seems that Excel has been properly closed and the process ended.

My problem is that once I have called "WithEvents", if I stop calling 
PumpWaitingMessages() Excel is freezing because it's waiting for the events to 
be processed.
Is there any way to "undo" what "WithEvents" is doing so that the server 
(Excel) is not waiting for the message to be pumped (and do not freeze if I 
stop calling PumpWaitingMessages()) ?

Thanks a lot for your help,
G.

________________________________
De : Mark Hammond <mhamm...@skippinet.com.au>
Envoyé : 29 novembre 2024 14:10
À : Gauthier ABRIAL <g_abr...@hotmail.com>; python-win32@python.org 
<python-win32@python.org>
Objet : Re: [python-win32] How to correctly handle events using win32com ?


It's been a while since I've done any of this, but I think there's an 
"xlApp.Quit()" method you can use? If so, then you might be able to break out 
of the look when "PumpWaitingMessages()" returns 1 - that will mean the message 
queue has received a WM_QUIT.


On 2024-11-29 12:17 p.m., Gauthier ABRIAL 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<mailto: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