Comment effacer une fenêtre secondaire par le clavier
Résolu
zatox
Messages postés
640
Date d'inscription
Statut
Membre
Dernière intervention
-
zatox Messages postés 640 Date d'inscription Statut Membre Dernière intervention -
zatox Messages postés 640 Date d'inscription Statut Membre Dernière intervention -
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:
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 !!!!!!!!!!!!!!!!!!!
#!/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:
- Comment effacer une fenêtre secondaire par le clavier
- Télécharger clavier arabe - Télécharger - Divers Web & Internet
- Comment taper / sur clavier - Guide
- Comment faire le + sur clavier telephone iphone - Guide
- Clavier de l'ordinateur - Guide
- Raccourci clavier réduire fenetre - Guide
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.
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()
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.
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.