Thread erzeugt Fehlermeldung

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.
Benutzeravatar
snakeseven
User
Beiträge: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Thread erzeugt Fehlermeldung

Beitragvon snakeseven » Freitag 27. Januar 2006, 00:10

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=]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)[/code]

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()
Benutzeravatar
snakeseven
User
Beiträge: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Beitragvon snakeseven » Freitag 27. Januar 2006, 16:27

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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]