2011-01-10 7 views
6

Ich schreibe ein Client-Server-Programm in Python mit Tkinter. Ich brauche den Server, um die verbundenen Kunden im Auge zu behalten. Dazu möchte ich, dass der Client eine automatische Nachricht an den Server sendet, nachdem der Exit-Button (der Standard "X" in der Ecke) angeklickt wurde. Wie kann ich wissen, wann der Benutzer das Programm beendet?Intercept Tkinter "Exit" -Befehl?

+0

möglich Duplikat [? Wie gehe ich das Fenster schließen Ereignis in Tkinter] (http://stackoverflow.com/questions/111155/how-do-i-handle- the-window-close-event-in-tkinter) – nbro

Antwort

13

Sie möchten die Methode wm_protocol des Toplevel-Fensters verwenden. Speziell interessiert Sie das Protokoll WM_DELETE_WINDOW. Wenn Sie diese Methode verwenden, können Sie einen Rückruf registrieren, der aufgerufen wird, wenn das Fenster zerstört wird.

Verbrauch:

root.protocol("WM_DELETE_WINDOW", app.on_delete) 
+0

Also habe ich diese Zeile hinzugefügt: 'root.protocol (" WM_DELETE_WINDOW ", app.on_delete())' kurz vor meinem Aufruf von 'root.mainloop()' aber 'on_delete() 'wird aufgerufen, wenn das Fenster * geöffnet * ist und nicht, wenn es geschlossen ist. Mache ich etwas falsch? – John

+5

@ John: Die 'Protokoll'-Methode nimmt einen Verweis auf eine Funktion. Wenn Sie die nachstehende Klammer hinzufügen, rufen Sie 'app.on_delete' auf und übergeben das Ergebnis dieser Methode an den Protokollhandler. Die korrekte Verwendung ist 'root.protocol (" WM_DELETE_WINDOW ", app.on_delete)' –

+0

Perfekt! Vielen Dank! – John

1

FWIW: Es ist auch möglich, ein Widget spezifisches Verhalten zuweisen.

Wenn Sie möchten, dass eine Aktion ausgeführt wird, wenn ein bestimmtes Widget zerstört wird, können Sie die Methode destroy() außer Kraft setzen. Siehe das folgende Beispiel:

class MyButton(Tkinter.Button): 
    def destroy(self): 
     print "Yo!" 
     Tkinter.Button.destroy(self) 

root = Tkinter.Tk() 

f = Tkinter.Frame(root) 
b1 = MyButton(f, text="Do nothing") 
b1.pack() 
f.pack() 

b2 = Tkinter.Button(root, text="f.destroy", command=f.destroy)   
b2.pack() 

root.mainloop() 

Wenn die Taste ‚b2‘ gedrückt wird, wird der Rahmen ‚f‘ zerstört, mit dem Kind ‚b1‘ und „Yo!“ ist gedruckt.

Ich veröffentlichte die gleiche Antwort auf this topic.

1

In meinem Fall, der folgende Code nicht funktioniert:

root.protocol("WM_DELETE_WINDOW", app.on_delete) # doesn't work 

Es ist jedoch mit dieser Form gearbeitet:

root.wm_protocol ("WM_DELETE_WINDOW", app.on_delete) # does work 
+0

Es gibt keine Antwort, die sagt, '.protocol' zu verwenden, obwohl ... die akzeptierte Antwort bereits besagt,' .wm_protocol' zu verwenden. – ArtOfWarfare

5

können Sie Python atexit Modul verwenden.

Zum Beispiel:

import atexit 

def doSomethingOnExit(): 
    pass 

atexit.register(doSomethingOnExit) 
+0

Das hat perfekt für mich funktioniert. Die anderen wurden nie ausgelöst. – ArtOfWarfare