Comment effacer une fenêtre secondaire par le clavier

Résolu/Fermé
zatox Messages postés 640 Date d'inscription samedi 17 février 2007 Statut Membre Dernière intervention 26 juin 2020 - Modifié le 2 févr. 2019 à 20:18
zatox Messages postés 640 Date d'inscription samedi 17 février 2007 Statut Membre Dernière intervention 26 juin 2020 - 4 févr. 2019 à 00:10
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 !!!!!!!!!!!!!!!!!!!
A voir également:

3 réponses

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()
0
zatox Messages postés 640 Date d'inscription samedi 17 février 2007 Statut Membre Dernière intervention 26 juin 2020 65
2 févr. 2019 à 20:11
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.
0
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
.
0
zatox Messages postés 640 Date d'inscription samedi 17 février 2007 Statut Membre Dernière intervention 26 juin 2020 65
4 févr. 2019 à 00:10
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.
0