Pregunta

Estoy haciendo una pequeña aplicación con Tkinter. Me gustaría limpiar algunas cosas en una función llamada cuando mi ventana está cerrada. Estoy tratando de vincular el evento cerrado de mi ventana con esa función. No sé si es posible y cuál es la secuencia correspondiente.

La documentación de Python dice: See the bind man page and page 201 of John Ousterhout’s book for details.

Desafortunadamente, no tengo estos recursos en mis manos. ¿Alguien sabe la lista de eventos que pueden vincularse?

Una solución alternativa sería limpiar todo en el __del__ de mi clase Frame. Por una razón desconocida, parece que nunca se llama. ¿Alguien sabe cuál puede ser la causa? Algunas dependencias circulares?

Tan pronto como agrego un control (descomente en el código a continuación), el <=> ya no se llama. ¿Alguna solución para ese problema?

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()
¿Fue útil?

Solución

Creo que esta es la página de enlace que puede tener estado buscando Creo que el evento que está intentando vincular es Destroy. No se debe confiar en __del__ (es demasiado difícil saber cuándo un bucle de referencia circular, por ejemplo, el widget de padre a hijo y viceversa, evitará que se active), definitivamente es preferible utilizar el enlace de eventos.

Otros consejos

Un recurso más o menos definitivo para eventos es la enlazar página de manual para Tk . No estoy exactamente claro qué es lo que quiere hacer, pero el enlace "<Destroy>" es probablemente el evento que está buscando. Si hace lo que realmente necesita, no lo sé.

 ...
 self.bind("<Destroy>", self.callback)
 ...
 def callback(self, event):
     print("callback called")
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top