Protokolleintag beim Beenden von Windows

Fragen zu Tkinter.
Antworten
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Hallo Pythonfreunde,

ich habe mir folgendes Script geschieben um den Start und das Beenden von Windows zu protokollieren. Leider bekomme ich den WM_ENDSESSION Event irendwie nicht mit. An was könnte das liegen.

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
import time
import winsound
import thread
from Tkinter import * 

def Startup():
    savefile = "c:/work/zeiterfassung/proto.txt"
    YYYY,MM,DD,hh,mm,ss,dw,dy,x = time.localtime()
    try:
        fz = open(savefile, "a")
        fz.write("PC Startup: " + str(DD) + "." + str(MM) + "." + str(YYYY) + " " + str(hh) + ":" + str(mm) + ":" + str(ss) + "\n")
        fz.close()
    except:
        print "Konnte Datei nicht öffnen!"


def gettime():
	YYYY,MM,DD,hh,mm,ss,dw,dy,x = time.localtime()
	# kommentar
	if ss == int(0) and mm == int(0) and hh == int(12) and dw < 4:
		winsound.PlaySound("c:\scripts\SPEECH\Pause.wav",0)		
	if ss == int(0) and mm == int(0) and hh == int(9):
		winsound.PlaySound("c:\scripts\SPEECH\SpielUnterbrochen.WAV",0)


def Shutdown():
    print "Shutdown"
    savefile = "c:/work/zeiterfassung/proto.txt"
    YYYY,MM,DD,hh,mm,ss,dw,dy,x = time.localtime()
    
    fz = open(savefile, "a")
    fz.write("PC Shutdown: " + str(DD) + "." + str(MM) + "." + str(YYYY) + " " + str(hh) + ":" + str(mm) + ":" + str(ss) + "\n")
    fz.close()
    sys.exit(0)

    """print "Konnte Datei nicht öffnen!"
    sys.exit(0)
    return -1"""
        
        
def Main(mf, lblTimeDate):
    while 1:
        YYYY,MM,DD,hh,mm,ss,dw,dy,x = time.localtime()
        if ss <= 9:
            ss = "0" + str(ss)
        if mm <= 9:
            mm = "0" + str(mm)
        if hh <= 9:
            hh = "0" + str(hh)
        if DD <= 9:
            DD = "0" + str(DD)
        if MM <= 9:
            MM = "0" + str(MM)
        
        DateAndTime = str(DD) + "." + str(MM) + "." + str(YYYY) + " " + str(hh) + ":" + str(mm) + ":" + str(ss)
        lblTimeDate["text"] = DateAndTime
        gettime()
        time.sleep(0.8)
        
	
Startup()
mf = Tk(className="MyTime2.0")
mf.protocol("WM_ENDSESSION", Shutdown)
mf.protocol("WM_QUERYENDSESSION", Shutdown)
mf.protocol("WM_DELETE_WINDOW", Shutdown)
mf.geometry('300x30+0+0')
#mf.overrideredirect(1) # fenster ohne aussen rum :-) 
mf.attributes('-alpha', 0.5) # fenster transparent
#mf.attributes('-topmost', 1) # fenster immer im vordergrund 
lblTimeDate = Label(mf, text = "", font = "courier 20 bold")
lblTimeDate.pack()
thread.start_new_thread(Main,(mf,lblTimeDate))
mf.mainloop()



Danke für eure Hilfe
alpha
BlackJack

Bei dem Windowsproblem kann ich leider nicht weiterhelfen, aber einen Tipp für das Programm hätte ich trotzdem: Man sollte sich nicht wiederholen. Wenn ein grösseres Stück Quelltext mehrfach vorkommt, sollte man das in eine Funktion auslagern. Das betrifft hier die Umwandlung der Zeit in eine Zeichenkette. Ausserdem geht das mit `time.strftime()` wesentlich einfacher und kompakter.

Ein Problem kann auch der Thread werden. GUI-Toolkits mögen es in der Regel nicht, wenn man von verschiedenen Threads aus auf die GUI zugreift. Tkinter ist da keine Ausnahme. Wenn das so funktioniert, ist das Zufall. Verlassen sollte man sich nicht darauf.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

In 'An-Introduction-To-Tkinter' (http://www.pythonware.com/library/tkint ... /index.htm) von Fredrik Lundh sieht es so aus, als ob protocol nur bestimmte Protokolle unterstützt:

Code: Alles auswählen

protocol(name, function). Register function as a callback which will be called for the given
protocol. The name argument is typically one of BWM_DELETE_WINDOW (the window is
about to be deleted), WM_SAVE_YOURSELF (called by X window managers when the
application should save a snapshot of its working set) or WM_TAKE_FOCUS (called by X
window managers when the application receives focus).
und Seite 23 + 24.
MfG
HWK
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Danke erstmal für die Infos.
Ich weiß schon das ganze ist quick & dirty gemacht.
Es wundert mich halt, daß WM_DELETE_WINDOW funktioniert, die anderen
aber nicht. Geht das eventuell nur unter anderen Betriebsystemen?
Ich kenne das ganze nur von Visual Basic. Da kann man im "QueryUnload" Ereignis eines Fensters noch Code ausführen. Sowas gibt es doch sicher bei TK auch.

Grüße
alpha
Antworten