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?
Antwort
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)
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
@ 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)' –
Perfekt! Vielen Dank! – John
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.
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
Es gibt keine Antwort, die sagt, '.protocol' zu verwenden, obwohl ... die akzeptierte Antwort bereits besagt,' .wm_protocol' zu verwenden. – ArtOfWarfare
können Sie Python atexit
Modul verwenden.
Zum Beispiel:
import atexit
def doSomethingOnExit():
pass
atexit.register(doSomethingOnExit)
Das hat perfekt für mich funktioniert. Die anderen wurden nie ausgelöst. – ArtOfWarfare
- 1. Exit-Code umgeleiteter Befehl
- 2. Exit Schwein Shell-Befehl sicher
- 3. Exit-Code von ssh Befehl
- 4. Befehl an Taste zuweisen - Tkinter
- 5. Intercept Visual Studio-Einfügeaktion
- 6. Exit-Befehl ohne Bestätigung in Python
- 7. Cordova: Befehl mit Exit-Code fehlgeschlagen EACCES
- 8. Python Tkinter Befehl Klicken Sie auf
- 9. Tkinter Befehl Probleme mit Toplevel auf Kindklasse
- 10. Lambda Variablenzuweisung (für Tkinter Befehl Rückrufe)
- 11. JavaScript Intercept Modul Import
- 12. Paste Intercept event failure
- 13. Intercept Log Messages slf4j
- 14. BreezeJS Intercept Serverantwort
- 15. jQuery Intercept Form Vorlage
- 16. Lawful Intercept in FreeSWITCH®
- 17. Intercept JDBC-Verbindung
- 18. Intercept Windows öffnen Datei
- 19. Android WebView - Intercept Klicks
- 20. Intercept-Methodenaufrufe in Python
- 21. Intercept ActiveRecord setet_connection Initialisierungsprozess
- 22. Retrofit - Intercept Antworten global
- 23. GDAL-Fehler: Befehl 'cc' fehlgeschlagen mit Exit-Status 1
- 24. Wie Exit-Code von Remote-Befehl durch ssh
- 25. Linker Befehl mit Exit-Code fehlgeschlagen 1: doppeltes Symbol
- 26. Wie kann ich Exit-Status von Null mit Kill-Befehl
- 27. Der folgende SSH-Befehl mit einem Nicht-Null-Exit-Status
- 28. Wie kann der Befehl exit in bash_profile alias eingebunden werden?
- 29. xcodebuild (XCode 7.1) - unerwartet erfolgreichen Exit-Code von abgebrochen Befehl
- 30. Wie Exit-Code 0 von einem fehlgeschlagenen Befehl zurückgegeben wird
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