Seite 1 von 1

Spyder5+win32com+Excel: Excel friert ein wenn Script beendet wird

Verfasst: Freitag 6. Mai 2022, 10:55
von HoWei
Das u.g. Problem existiert nur mit der Spyder5 IDE - wenn ich das Script auf der Kommandozeile ausführe passiert das nicht !

Ich verwendet Python3.9:
Ich öffne über "win32com" eine Verbindung zu Excel und fange einen Button-Doppelclick ab.
Die While-Schleife wird durch den Doppelclick beendet und das Script beendet.

Problem:
Danach ist das Excel-Fenster eingefroren und ich kann es nicht mehr verwenden.
Erst wenn ich in Spyder5 den IPython-Kernel neu starte, wird kann das Excel-Fenster wieder verwendet werden.

Es scheint als hält der IPython Kernel noch eine Verbindung zu Excel und friert dies ein.
Ist wohl ein Problem des IPython-Kernels, der ja in Spyder nicht geschlossen wird nachdem das Script am Ende ankommt.
Ich habe schon danach gesucht wie ich die "win32com" Verbindung vor dem Beenden auflöse - ohne Erfolg.

Hat jemand eine Idee wie man das löst , so dass Excel nicht einfriert ?

Code: Alles auswählen

import win32com.client as win32
import pythoncom

# use absolute pathes
WORKBOOK = "d:/LabTestPy/labPyCommon/test/test_excel_RegDict.xlsx"
WORKSHEET = "Sheet"

# the button event will open this class
class ButtonEvents:
    # method executed on doubleclick to close while loop
    def OnDblClick(self, *args):
        print("button double clicked")
        global keepOpen
        keepOpen = False

#config win32com excel connection
xlApp = win32.gencache.EnsureDispatch('Excel.Application')
xlApp.Visible = True
xlWb = xlApp.Workbooks.Open(WORKBOOK)
xlWs = xlWb.Sheets(WORKSHEET)
# define button event callback class
xlButtonEvents=win32.WithEvents(xlWs.OLEObjects("CommandButton1").Object,ButtonEvents)

# a global variable to exit the while-loop
global keepOpen
keepOpen = True

# a while loop to wait until the button in excel is double-clicked
while keepOpen:
    pythoncom.PumpWaitingMessages()

print("Script finished")

Re: Spyder5+win32com+Excel: Excel friert ein wenn Script beendet wird

Verfasst: Freitag 6. Mai 2022, 12:33
von HoWei
Nachtrag:
Dieses einfrieren passiert auch wenn man das Skript in einer einfachen Python-Interpreter Konsole ausführt.
Erst nach einem "exit()" kann man Excel wieder benutzten.

Code: Alles auswählen

(venvPy39) PS D:\LabTestPy\labPyCommon\test> python
Python 3.9.6 (tags/v3.9.6:db3ff76, Jun 28 2021, 15:26:21) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import test_excel_events_simple.py
button double clicked
Script finished
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'test_excel_events_simple.py'; 'test_excel_events_simple' is not a package
>>>
>>>
>>> exit()