Seite 1 von 1

Thread erzeugt Fehlermeldung

Verfasst: Freitag 27. Januar 2006, 00:10
von snakeseven
Und wieder was zum Rätseln:
Folgendes Script (Auszug) erstellt um 23:58 ein Excel-Protokoll.
Starte ich das Script um 23:59 wird das Protokoll wie zu erwarten sofort erstellt.
Starte ich es vor 23:58 und drücke den "Protokoll" Button, wird das Protokoll
ebenfalls korrekt erstellt. Starte ich aber das Script vor 23:58 und warte bis 23:58,
dann kommt folgende Fehlermeldung:

Code: Alles auswählen

File "test2.py", line 34, in Protokoll
    Report = win32com.client.Dispatch("Excel.Application")
  File "C:\Programme\Python24\Lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch
    dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
  File "C:\Programme\Python24\Lib\site-packages\win32com\client\dynamic.py", line 91, in _GetGoodDispatchAndUserName
    return (_GetGoodDispatch(IDispatch, clsctx), userName)
  File "C:\Programme\Python24\Lib\site-packages\win32com\client\dynamic.py", line 79, in _GetGoodDispatch
    IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
com_error: (-2147221008, 'CoInitialize wurde nicht aufgerufen.', None, None)
Ersetze ich im Script den Thread durch eine While-Schleife, gibt es keine Fehlermeldung, habe dann aber keinen
10 Sekunden Takt (der für den Rest der Anwendung nötig ist). Was macht der Thread, daß es zu der
Fehlermeldung kommt ?

Soviel für die Nacht , Seven

Hier das Script:

Code: Alles auswählen

import time,sys,string,win32com.client,win32api,threading,os
from Tkinter import Tk,Button
from tkSnack import initializeSnack

root =  Tk()
initializeSnack(root)

class globelvars:
    fname1 = ''
    fname2 = ''
    loct = 0
    
gv = globelvars()

def Beenden(event=None):
    T.cancel()
    sys.exit(0)
    
def Handle(): 
    global T
    
    T = threading.Timer(10, Handle)     #Alle 10 Sekunden pruefen
    T.start()
    
    gv.loct = time.localtime()
    gv.fname2 = 'Protokoll' + "_%02d%02d" % (gv.loct[2],gv.loct[1]) + str(gv.loct[0])[2:]
        
    if gv.loct[3] == 23 and gv.loct[4] >= 58:              #Um 23:58 Protokoll erstellen
        if not os.path.isfile("G:/tempfiles/" + gv.fname2 + ".xls"):
            Protokoll()
            
def Protokoll():
    Report = win32com.client.Dispatch("Excel.Application")
    Report.Visible = 0

    workbook = Report.Workbooks.Add()
    worksheet = workbook.Worksheets('Tabelle1')
    worksheet.Name = 'Ausgang'
    header = ["ID","Text","Archiv","Musik ?","E-Mail / Kunde","Tel. Nr.","Eingang","Ausgang"]
    width = ['6','15','25','10','20','17','17','17']
            
    for j in range(1,9):                #Kopfzeile eintragen
        cell = worksheet.Cells(1,j)
        cell.ColumnWidth = width[j-1]
        cell.Font.Bold = 1
        cell.Font.Size = 12
        cell.Value = header[j-1]
    """
    z = 1
    for i in range(1,5):
        gv.fname1 = "Bestell" + str(i) + "_%02d%02d" % (gv.loct[2],gv.loct[1]) + str(gv.loct[0])[2:]
        d = open("G:/tempfiles/" + gv.fname1 + ".txt","r")
        d.seek(0)                   #bei Byte #4 steht steht 'previous'
        lst = int(d.read(4))
        d.seek(32)                  #Daten beginnen ab Byte 32
        na = d.readlines()
        d.close()
   
        for j in range(0,lst-1,11):
            worksheet.Cells(z+1,1).Value = "_" + na[j][:-1]       #ID, [:-1] = ohne \n
            worksheet.Cells(z+1,2).Value = na[j+1][:-1]           #Text
            worksheet.Cells(z+1,3).Value = na[j+2][1:-1]+"   "+na[j+3][1:-1]+"   "+na[j+4][1:-1] #Archiv
            temp = na[j+5][:-1]
            trenner = string.find(temp,'/')
            if temp[0:trenner] =='mit Musik':
                worksheet.Cells(z+1,4).Value = 'mit Musik'        #Musik
            else:
                worksheet.Cells(z+1,4).Value = ''
            worksheet.Cells(z+1,5).Value = na[j+6][:-1]           #EMail
            worksheet.Cells(z+1,6).Value = na[j+7][:-1]           #Telnr
            worksheet.Cells(z+1,7).Value = na[j+8][:-1]           #Eingang
            worksheet.Cells(z+1,8).Value = na[j+9][:-1]           #Ausgang
            z += 1
        z += 1              #Leerzeile
    """
    workbook.SaveAs("G:/tempfiles/" + gv.fname2 + ".xls")
    Report.Quit()
    del(cell) 
    del(worksheet) 
    del(workbook) 
    del(Report) 
    
protok = Button(root,font='ansifixed', text = "Protokoll ", command = Protokoll)
protok.pack()
bstop = Button(root,font='ansifixed', text = "Beenden", command = Beenden)
bstop.pack()

Handle()
root.mainloop()

Verfasst: Freitag 27. Januar 2006, 16:27
von snakeseven
Habs:
Wenn ich den Import von win32com direkt in der Funktion ausführe und nicht global, kommt keine Fehlermeldung. Fragt mich aber nicht warum.

So gehts:

Code: Alles auswählen

def Protokoll():
    import win32com.client
So nicht (???):

Code: Alles auswählen

import win32com.client
def Protokoll():
Seven