Quais os eventos podem ser vinculado a um quadro Tkinter?
-
05-07-2019 - |
Pergunta
Estou fazendo uma pequena aplicação com Tkinter. Gostaria de limpar algumas coisas em uma função chamada quando a minha janela é fechada. Estou tentando ligar o evento perto da minha janela com essa função. Eu não sei se é possível e qual é a sequência correspondente.
A documentação Python diz:. See the bind man page and page 201 of John Ousterhout’s book for details
Infelizmente, eu não tenho esses recursos em minhas mãos. Alguém sabe a lista de eventos que podem ser vinculados?
Uma solução alternativa seria tudo limpo no __del__
da minha classe Frame. Por uma razão desconhecida, parece que nunca é chamado. Alguém sabe o que pode ser a causa? Algumas dependências circulares?
Assim, eu adicionar um controle (uncomment no código abaixo), o __del__
não é chamado anymore. Qualquer solução para esse 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()
Solução
Eu acredito este é a página homem ligam você pode ter sido procurando; Eu acredito que o evento que você está tentando ligar é Destroy
. __del__
não está a ser invocado (muito difícil de saber quando um loop de referência circular, por exemplo pai para widget filho e para trás, vai impedi-lo de disparar!), usando a ligação evento é definitivamente preferível.
Outras dicas
A mais ou menos recurso definitivo para eventos é o href="http://tcl.tk/man/tcl8.6/TkCmd/bind.htm" rel="nofollow noreferrer"> página homem . Eu não estou exatamente claro o que você está querendo fazer, mas obrigatória para "<Destroy>"
é provavelmente o evento que você está procurando. Se ele faz o que você realmente precisa, eu não sei.
...
self.bind("<Destroy>", self.callback)
...
def callback(self, event):
print("callback called")