Fermer automatiquement la fenêtre après un certain temps
Dans une classe, dans une fonction, je suis entrain de créer un Tkinter Toile. Cette fonction est appelée par une autre classe, je voudrais, pour Tkinter fenêtre de pop-up pendant 30 secondes, puis se fermer. Je l'ai appeler
master.mainloop()
time.sleep(30)
master.destroy()
Mais j'obtiens une erreur
"elf.les savoirs traditionnels.call('détruire', self._w)
_tkinter.TclError: ne peut pas invoquer la "destruction" de la commande: la demande a été détruit"
Alors, comment puis-je l'avoir près de lui-même?
Vous avez besoin d'une sorte de tutoriel sur ce que signifie un interface graphique avec une boucle d'événements, parce que jusqu'à ce que vous obtenez, vous allez continuer à courir dans des problèmes de ce genre et ne pas les comprendre. (Désolé, je n'ai pas à recommander, mais peut-être que quelqu'un d'autre.) Il est intéressant de noter que les serveurs de réseau et de nombreux autres types de programmes en plus d'applications à interface graphique sont également construite autour de la boucle d'événement, c'est donc une jolie touche de chose à comprendre dans la programmation au-delà de jouet systèmes.
OriginalL'auteur EasilyBaffled | 2013-03-09
Vous devez vous connecter pour publier un commentaire.
Ne pas utiliser
time.sleep()
avec tkinter. Au lieu de cela, appelez la fonctionaprès
sur le widget que vous souhaitez fermer.Ici, c'est le plus simple exemple:
Oui, le
import as
est utilisé pour éviter les collisions de noms, et aussi pour rendre le nom des modules plus courts. Je l'utilise très souvent dans Tkinter, mais pour cet exemplefrom Tkinter import Tk
et l'utilisationw = Tk()
est également valide.Une autre raison pour
import Tkinter as tk
est de sorte que vous pouvez porter votre code à 3.x en changeant juste que la première ligne deimport tinter as tk
sans modification de tous les autres lieux que vous faites référence au module.Je suis sur osx avec python3.4 et ce n'est pas de travail, la fenêtre n'est pas de détruire lui-même.
OriginalL'auteur A. Rodas
Le problème ici est que
mainloop()
ne pas revenir jusqu'à ce que le GUI a fermé.Alors, 30 secondes après le GUI a fermé et détruit lui-même, vous essayez de le détruire. Et, évidemment, qui échoue.
Mais vous ne pouvez pas déplacer le
sleep
etdestroy
les appels à l'intérieur de la boucle principale, parce que si voussleep
dans le milieu de la boucle principale, le GUI le gel.Donc, vous avez besoin d'une sorte de minuteur qui ne va pas arrêter la boucle principale.
tkinter
comprend laafter
méthode pour exactement cet effet. Cette réponse donne un exemple détaillé de l'utiliser.OriginalL'auteur abarnert