3
votes

Comment fermer uniquement la fenêtre TopLevel dans Python Tkinter?

Utilisez le Python Tkinter, créez un sous-panneau (TopLevel) pour afficher quelque chose et obtenir l'entrée de l'utilisateur, après l'entrée de l'utilisateur, a cliqué sur le "EXIT" trouvé toute l'interface graphique (panneau principal) également destory. Comment fermer uniquement la fenêtre de premier niveau?

from tkinter import *

lay=[]
root = Tk()
root.geometry('300x400+100+50')

def exit_btn():
    top = lay[0]
    top.quit()
    top.destroy()

def create():
    top = Toplevel()
    lay.append(top)

    top.title("Main Panel")
    top.geometry('500x500+100+450')
    msg = Message(top, text="Show on Sub-panel",width=100)
    msg.pack()

    btn = Button(top,text='EXIT',command=exit_btn)
    btn.pack()

Button(root, text="Click me,Create a sub-panel", command=create).pack()
mainloop()


5 Réponses :


1
votes

Vous ne pouvez pas fermer la fenêtre racine. Lorsque vous fermez la fenêtre racine, toutes les fenêtres sont fermées. Parce que toutes les sous-fenêtres connectées à la fenêtre racine.

Vous pouvez masquer la fenêtre racine.

Masquer le nom de la méthode est withdraw() , vous pouvez utiliser la méthode d'exposition pour deiconify()

# Hide/Unvisible
root.withdraw()

# Show/Visible
root.deiconify()


1 commentaires

Merci beaucoup pour le partage de la solution, je peux l'utiliser dans un autre cas.



4
votes

Votre seule erreur est que vous appelez top.quit() en plus d'appeler top.destroy() . Il vous suffit d'appeler top.destroy() . top.quit() va tuer la mainloop , provoquant la fermeture du programme.


0 commentaires

4
votes

Cela a semblé fonctionner pour moi:

from tkinter import *

lay=[]
root = Tk()
root.geometry('300x400+100+50')

def create():

    top = Toplevel()
    lay.append(top)

    top.title("Main Panel")
    top.geometry('500x500+100+450')
    msg = Message(top, text="Show on Sub-panel",width=100)
    msg.pack()

    def exit_btn():

        top.destroy()
        top.update()

    btn = Button(top,text='EXIT',command=exit_btn)
    btn.pack()


Button(root, text="Click me,Create a sub-panel", command=create).pack()
mainloop()


0 commentaires

0
votes

vous pouvez utiliser la fonction lambda avec la commande c'est mieux que la fonction normale pour votre travail

ex)

btn = Button (haut, texte = 'EXIT', commande = exit_btn )

changez exit_btn en lambda :top.destroy()


0 commentaires

0
votes

Dans mon cas, j'ai passé une fonction de rappel de la classe parente, et une fois que le bouton d'envoi est cliqué, la fonction de rappel transmet les valeurs de retour.

La fonction de rappel appellera la méthode destroy sur l'objet de niveau supérieur, ainsi vous fermerez le cadre et aurez la valeur de retour.


0 commentaires