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"?
risposta
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)
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
@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)' –
Perfetto! Grazie! – John
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.
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
Non c'è risposta che dice di usare '.protocol', sebbene ... la risposta accettata abbia già detto di usare' .wm_protocol'. – ArtOfWarfare
È possibile utilizzare il modulo python atexit
.
Ad esempio:
import atexit
def doSomethingOnExit():
pass
atexit.register(doSomethingOnExit)
Questo ha funzionato perfettamente per me. Gli altri non si sono mai attivati. – ArtOfWarfare
- 1. Intercept windows open file
- 2. Intercept Log Messages slf4j
- 3. Intercept JDBC Connection
- 4. Il comando event_generate di Tkinter ignorato
- 5. Intercept evento pagina di uscita
- 6. iOS UIWebView intercept link click
- 7. Intercept XMLHttpRequest e modifica responseText
- 8. Intercept Incolla dati in JavaScript
- 9. API Twitter - Esci
- 10. Facebook iOS SDK Esci
- 11. Esci dall'API di LinkedIn
- 12. Esci Applicazione in Qt
- 13. Tkinter assegnare il comando pulsante in loop con lambda
- 14. Come posso passare argomenti al comando callback del pulsante Tkinter?
- 15. python tkinter restituisce il valore dalla funzione utilizzata nel comando
- 16. Python Intercept traffico web dal browser
- 17. Utilizzo di intercept-url in Spring security
- 18. Intercept cake2 postLink() modulo post con jQuery
- 19. Esci in ciclo - Processore comandi Windows (CMD.EXE)
- 20. Esci da tutte le sessioni
- 21. Esci nasconde l'interfaccia utente completa
- 22. Se non esiste, esci + cmd
- 23. Esci dalla modalità utente singolo
- 24. Tkinter messagebox senza finestra?
- 25. Animazione personalizzata per Toast entra/esci?
- 26. Aggiungi numeri ed esci con una sentinella
- 27. Esci e ripristina tutto nello script sull'errore
- 28. Istruzioni su Esci contro Esegui in SAS
- 29. Cattura about, preferences ed esci dal menu
- 30. Esci con codice errore in go?
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