2011-01-10 9 views
6

Sto scrivendo un programma client-server in Python con Tkinter. Ho bisogno del server per tenere traccia dei client connessi. Per questo, vorrei che il client inviasse un messaggio automatico al server dopo aver fatto clic sul pulsante di uscita (la "X" standard nell'angolo). Come posso sapere quando l'utente sta uscendo dal programma?Intercept Tkinter Comando "Esci"?

+0

possibile duplicato di [? Come posso gestire la finestra evento close a Tkinter] (http://stackoverflow.com/questions/111155/how-do-i-handle- the-window-close-event-in-tkinter) – nbro

risposta

13

Si desidera utilizzare il metodo wm_protocol della finestra di livello superiore. Nello specifico, sei interessato al protocollo WM_DELETE_WINDOW. Se si utilizza tale metodo, consente di registrare una richiamata che viene chiamata quando la finestra viene distrutta.

utilizzati:

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

Così ho aggiunto questa riga: 'root.protocol (" WM_DELETE_WINDOW ", app.on_delete())' subito prima della mia chiamata a 'root.mainloop()' ma 'on_delete() viene chiamato quando la finestra è * aperta * e non quando è chiusa. Sto facendo qualcosa di sbagliato? – John

+5

@John: il metodo 'protocol' prende un riferimento a una funzione. Aggiungendo la parentesi finale si chiama 'app.on_delete' e si passa il risultato di tale metodo al gestore del protocollo. L'uso corretto è 'root.protocol (" WM_DELETE_WINDOW ", app.on_delete)' –

+0

Perfetto! Grazie! – John

1

FWIW: È anche possibile assegnare un comportamento specifico gadget.

Se si desidera che un'azione si verifichi quando un determinato widget viene distrutto, è possibile prendere in considerazione l'override del metodo destroy(). Vedere l'esempio seguente:

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

Quando si preme il tasto 'b2', il telaio 'f' viene distrutta, con il bambino 'b1' e "Yo!" è stampato

Ho postato la stessa risposta su this topic.

1

Nel mio caso, il seguente codice non ha funzionato:

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

Tuttavia, ha funzionato utilizzando questo modulo:

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

Non c'è risposta che dice di usare '.protocol', sebbene ... la risposta accettata abbia già detto di usare' .wm_protocol'. – ArtOfWarfare

5

È possibile utilizzare il modulo python atexit.

Ad esempio:

import atexit 

def doSomethingOnExit(): 
    pass 

atexit.register(doSomethingOnExit) 
+0

Questo ha funzionato perfettamente per me. Gli altri non si sono mai attivati. – ArtOfWarfare