Welche Ereignisse können zu einem Tkinter Rahmen gebunden werden?
-
05-07-2019 - |
Frage
Ich mache eine kleine Anwendung mit Tkinter. Ich möchte einige Dinge in einer Funktion reinigen aufgerufen, wenn mein Fenster geschlossen wird. Ich versuche, das close Ereignis von meinem Fenster mit dieser Funktion zu binden. Ich weiß nicht, ob es möglich ist, und was ist die entsprechende Sequenz.
Die Python-Dokumentation sagt:. See the bind man page and page 201 of John Ousterhout’s book for details
Leider habe ich nicht diese Ressourcen in den Händen. Hat jemand die Liste der Ereignisse kennen, die gebunden werden können?
Eine alternative Lösung wäre alles in den __del__
meiner Frame-Klasse zu reinigen. Aus einem unbekannten Grund scheint es, dass es nie genannt wird. Hat jemand weiß, was die Ursache sein? Einige zirkulären Abhängigkeiten?
Sobald ich eine Kontrolle (uncomment im Code unten) hinzufügen, wird der __del__
nicht mehr genannt. Jede Lösung für dieses Problem?
from tkinter import *
class MyDialog(Frame):
def __init__(self):
print("hello")
self.root = Tk()
self.root.title("Test")
Frame.__init__(self, self.root)
self.list = Listbox(self, selectmode=BROWSE)
self.list.pack(fill=BOTH, expand=1)
self.pack(fill=BOTH, expand=1)
def __del__(self):
print("bye-bye")
dialog = MyDialog()
dialog.root.mainloop()
Lösung
Ich glaube, diese die bind-man-Seite ist, kann man gewesen suchen; Ich glaube, dass das Ereignis Sie versuchen Destroy
zu binden. __del__
nicht darauf verlassen werden (einfach zu schwer zu wissen, wann eine kreisförmige Referenzschleife, zum Beispiel Eltern auf das Kind-Widget und zurück, wird es aufhören auslöst!), unter Verwendung von Ereignisbindung ist auf jeden Fall vorzuziehen.
Andere Tipps
Eine mehr oder weniger endgültige Ressource für Veranstaltungen ist die binden Manpage rel="nofollow für Tk . Ich bin nicht genau klar, was Sie tun wollen, sind aber auf "<Destroy>"
Bindung ist wahrscheinlich das Event, das Sie suchen. Ob es das tut, was Sie wirklich brauchen, weiß ich nicht.
...
self.bind("<Destroy>", self.callback)
...
def callback(self, event):
print("callback called")