2009-07-29 4 views
1

Ich mache eine kleine Anwendung mit Tkinter. Ich würde gerne einige Dinge in einer Funktion reinigen, die aufgerufen wird, wenn mein Fenster geschlossen ist. Ich versuche, das schließen Ereignis meines Fensters mit dieser Funktion zu binden. Ich weiß nicht, ob es möglich ist und was die entsprechende Sequenz ist.Welche Ereignisse können an einen Tkinter Frame gebunden werden?

Die Python-Dokumentation sagt: See the bind man page and page 201 of John Ousterhout’s book for details.

Leider habe ich diese Ressourcen nicht in meinen Händen. Kennt jemand die Liste der Ereignisse, die gebunden werden können?

Eine alternative Lösung wäre, alles in der __del__ meiner Frame-Klasse zu reinigen. Aus einem unbekannten Grund scheint es, dass es nie aufgerufen wird. Weiß jemand, was die Ursache sein kann? Einige zirkuläre Abhängigkeiten?

Sobald ich ein Steuerelement (Kommentar im Code unten) hinzufügen, wird __del__ nicht mehr aufgerufen. Irgendeine 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() 

Antwort

3

Ich glaube this ist die Bindung Mann Seite, die Sie gesucht haben kann; Ich glaube, das Ereignis, das Sie versuchen zu binden, ist Destroy. __del__ ist nicht verlässlich (nur zu schwer zu wissen, wenn eine zirkuläre Referenzschleife, z. B. Eltern zu Kind Widget und zurück, wird es austriggern!), Event-Bindung ist definitiv vorzuziehen.

+0

Es funktioniert perfekt. Vielen Dank. Ich stimme zu, dass der Zirkelschluss ein Albtraum ist. – luc

+1

Ich denke, das wäre eine bessere Antwort, wenn der Link auf die Manpage nicht auf einen persönlichen Account bei Princeton verweisen würde. Bei tcl.tk/man gibt es eine offizielle Reihe von Manpages. –

+0

@Bryan guter Punkt, änderte die URL entsprechend, TX. –

3

Eine mehr oder weniger definitive Ressource für Ereignisse ist die bind man page for Tk. Ich weiß nicht genau, was Sie tun wollen, aber die Bindung an "<Destroy>" ist wahrscheinlich das Ereignis, das Sie suchen. Ob es tut, was du wirklich brauchst, weiß ich nicht.

... 
self.bind("<Destroy>", self.callback) 
... 
def callback(self, event): 
    print("callback called") 
+0

Thnaks für die Antwort und den Link. Leider kann ich nur die richtige Antwort wählen. Aber ich habe aufgewertet :-) – luc