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()
War es hilfreich?

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")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top