Menu

Comment effacer une fenêtre secondaire par le clavier [Résolu]

Messages postés
628
Date d'inscription
samedi 17 février 2007
Dernière intervention
4 février 2019
-
Bonjour, avec tkinter j'ouvre une fenêtre principale dans laquelle j'ai un bouton sur lequel je peux cliquer pour ouvrir une fenêtre secondaire (toplevel) en plein écran. Je voudrais pouvoir revenir à la fenêtre principale en effaçant la fenêtre secondaire par pression d'une touche clavier. Je n'arrive pas à le faire. Voici mon code:

#!/usr/bin/python3
# -*- coding: iso-8859-15 -*-

import os
from tkinter import *

fen_00 = Tk()

def fen_01():
        
        f01=Toplevel()
        f01.title('PYTHON3: Fenêtre fen_01')
        f01.attributes("-fullscreen", 1, "-alpha", 0.0)
        canvas = Canvas(f01,width=1920, height=1080)
        canvas.create_image(0, 0, anchor=NW, image=photo)
        canvas.create_text(900, 355, text='<<-------- Vénus', font=('ChopinScript', '26'), fill='#ffff00', activefill='#ffffff')
        canvas.create_text(1000, 1000, text='Kubuntu 18.04 sur Sda3, /home sur Sda 5', font=('ChopinScript', '30',), fill='#ffffff', activefill='#c15d3a')
   
        canvas.pack()

        f01.bind('<Escape>', quit)

        #f01.bind('<R>', command=f01.destroy) # MARCHE PAS !!!!!!!!!!!!!!!!!!!
       
        f01.mainloop()
            
photo = PhotoImage(file=os.getcwd() + "/image/venus.gif")        
fen_00.title('PYTHON3: Fenêtre fen_00')

fen_00.update() # Suivant le WM. A faire dans tous les cas donc.

fenrw = 860
fenrh = 500
sw = fen_00.winfo_screenwidth()
sh = fen_00.winfo_screenheight()

fen_00.geometry("%dx%d+%d+%d" % (fenrw, fenrh, (sw-fenrw)/2, (sh-fenrh)/2))

a=Button(fen_00, text='Quitter',command=fen_00.quit)
a.pack()
b=Button(fen_00, text='Fenêtre fen_01',command=fen_01)
b.pack()

fen_00.mainloop()



De la même façon que je fais:
f01.bind('<Escape>', quit)

pour quitter le programme par pression sur la touche "Escape" (ça marche)
je voudrais pouvoir appuyer sur la touche R pour effacer la fenêtre f01 mais ne pas fermer la fenêtre principale. J'arrive à le faire avec un bouton sur la fenêtre secondaire mais je ne veux pas de bouton, je veux simplement appuyer sur une touche pour fermer la fenêtre secondaire et retrouver derrière ma fenêtre principle.

J'espère que mes explications sont claires, merci pour vos réponses.

#f01.bind('<R>', command=f01.destroy) # MARCHE PAS !!!!!!!!!!!!!!!!!!!
Afficher la suite 

Votre réponse

3 réponses

0
Merci
Bonjour.

La méthode destroy ne doit pas recevoir d'arguments, mais la méthode bind fournit à la fonction en paramètre un objet Event.

Ce qu'il faut donc faire est d'utiliser une fonction intermédiaire afin de ne pas fournir l'objet Event à la méthode destroy, les fonctions anonymes (lambda) servent couramment à cet usage.

import tkinter as tk

def toplevel(master):
    tl = tk.Toplevel(master)
    tl.bind("<R>", lambda evt: tl.destroy())
    
root = tk.Tk()
tk.Button(root, text="toplevel", command=lambda : toplevel(root)).pack()

root.mainloop()
Commenter la réponse de jupiterien
Messages postés
628
Date d'inscription
samedi 17 février 2007
Dernière intervention
4 février 2019
73
0
Merci
Bonsoir et merci, super ça marche très bien, juste un détail:
je clique sur le bouton pour accéder à la deuxième fenêtre, là quand j'enfonce la touche "R" la deuxième fenêtre, celle sur laquelle je suis, s'efface et laisse place à la première fenêtre, c'est exactement ce que je voulais. Mais si je fais plusieurs aller retour fenêtre 1 puis 2 puis "R" puis re-fenêtre 2 etc ... ça marche mais ensuite si je clique sur "quitter" je dois le faire plusieurs fois (je pense autant de fois que j'ai fait des aller-retour fenêtre 1 fenêtre 2) !!!
Ce qui gère ça c'est cette ligne: f01.bind('<Escape>', quit)
Est-ce qu'il y aurait moyen de tout fermer à la première pression de la touche "Escape" quel que soit le nombre d'aller et de retours ?
La commande qui gère l'appui sur la croix en haut à droite de la fenêtre ferait l'affaire car ça ferme tout en une seule fois, mais je ne la connais pas !!!
Encore merci pour votre aide.
Bonjour.

Cela vient du fait que tu as des mainloop sur tes toplevels, il ne faut avoir qu'un seul et unique appel au mainloop dans ton application, donc il faut supprimer la ligne
f01.mainloop()
dans ta fonction
fen_01
.
Commenter la réponse de zatox
Messages postés
628
Date d'inscription
samedi 17 février 2007
Dernière intervention
4 février 2019
73
0
Merci
Bonsoir, ah oui tu as raison, super, j'ai enlevé
f01.mainloop()
maintenant ça marche nickel chrome, merci beaucoup pour ton aide.
Je passe donc le sujet en résolu.
Commenter la réponse de zatox