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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
HoWei
User
Beiträge: 12
Registriert: Freitag 28. Juni 2019, 10:18

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")
HoWei
User
Beiträge: 12
Registriert: Freitag 28. Juni 2019, 10:18

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()
Antworten