Accès rapide :
Une première barre de menu simple
Ajout d'accélérateurs et de raccourcis clavier
Ajouter des sous-menus déroulants
Pour définir une barre de menu en Tkinter, il faut utiliser la classe Menu
.
Une instance de cette classe représente un conteneur regroupant un certain nombre d'éléments de menu.
Le premier niveau à considérer est la barre à proprement parler. Elle devra être ajoutée à la fenêtre via un appel à la méthode
config
.
Ensuite on doit ajouter les sous-menus à la barre : le menu « File », le menu « Edit »...
Chaque sous-menu sera associé à une étiquette dans la barre et il s'ouvrira en cas de clic sur l'étiquette.
Puis, nous devons ajouter des commandes (« New », « Open... », « Save »...) dans le sous-menu, via la méthode
add_command
.
Chaque commande doit être associée à un gestionnaire d'événement qui déclenchera en cas de clic : cela se fait lors de l'appel à
add_command
en y passant le paramètre command
.
quit
permet de fermer la fenêtre courante.
Elle est accessible, par le jeu subtil de l'héritage, sur la classe Tk
.
Nous nous en servirons comme gestionnaire d'événements pour la commande « Exit ».
L'exemple suivant vous permettra certainement d'y voir plus clair.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#!/usr/bin/python3 from tkinter import * from tkinter import messagebox from tkinter.filedialog import askopenfilename class MyWindow(Tk): def __init__(self): Tk.__init__(self) self.create_menu_bar() # TODO: Fill the content of the window self.geometry("300x200") self.title("My First MenuBar V1.0") def create_menu_bar(self): menu_bar = Menu(self) menu_file = Menu(menu_bar, tearoff=0) menu_file.add_command(label="New", command=self.do_something) menu_file.add_command(label="Open", command=self.open_file) menu_file.add_command(label="Save", command=self.do_something) menu_file.add_separator() menu_file.add_command(label="Exit", command=self.quit) menu_bar.add_cascade(label="File", menu=menu_file) menu_edit = Menu(menu_bar, tearoff=0) menu_edit.add_command(label="Undo", command=self.do_something) menu_edit.add_separator() menu_edit.add_command(label="Copy", command=self.do_something) menu_edit.add_command(label="Cut", command=self.do_something) menu_edit.add_command(label="Paste", command=self.do_something) menu_bar.add_cascade(label="Edit", menu=menu_edit) menu_help = Menu(menu_bar, tearoff=0) menu_help.add_command(label="About", command=self.do_about) menu_bar.add_cascade(label="Help", menu=menu_help) self.config(menu=menu_bar) def open_file(self): file = askopenfilename(title="Choose the file to open", filetypes=[("PNG image", ".png"), ("GIF image", ".gif"), ("All files", ".*")]) print(file) def do_something(self): print("Menu clicked") def do_about(self): messagebox.showinfo("My title", "My message") window = MyWindow() window.mainloop() |
Voici le résultat produit par cette application.
Un raccourci correspond à la lettre soulignée sur un élément de menu, comme le montre la capture d'écran suivante.
En enclenchant la séquence de touches ALT
et la lettre soulignée, vous activerez l'ouverture du sous-menu ou de la commande associée.
Ces raccourcis sont très utiles aux personnes mal ou non voyantes pour activer les fonctionnalités d'une application graphique.
Un accélérateur est un autre mécanisme permettant de déclencher une commande à partir du clavier.
Pour lancer la commande « Open... » avec un raccourci, il faut procéder en deux temps :
premièrement, il faut taper la séquence ALT + F
et ensuite il faut appuyer sur O
.
Avec un accélérateur, une seule action suffit à déclencher la commande : CTRL + O
.
Pour afficher un accélérateur dans la commande, il faut ajouter le paramètre accelerator
lors de l'appel à la méthode
add_command
.
Tk.bind_all
.
Celle-ci accepte en paramètre la séquence de touches et le code à déclencher suite à l'appui sur la dite séquence de touches.
Voici un exemple montrant l'utilisation de ces raccourcis et de ces accélérateurs pour le menu « File ».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
#!/usr/bin/python3 from tkinter import * from tkinter import messagebox from tkinter.filedialog import askopenfilename class MyWindow(Tk): def __init__(self): Tk.__init__(self) self.create_menu_bar() # TODO: Fill the content of the window self.geometry("300x200") self.title("My First MenuBar V1.0") def create_menu_bar(self): menu_bar = Menu(self) menu_file = Menu(menu_bar, tearoff=0) menu_file.add_command(label="New", underline=0, accelerator="CTRL+N", command=self.do_something) menu_file.add_separator() menu_file.add_command(label="Open...", underline=0, accelerator="CTRL+O", command=self.open_file) menu_file.add_command(label="Save", underline=0, accelerator="CTRL+S", command=self.do_something) menu_file.add_separator() menu_file.add_command(label="Exit", underline=1, command=self.quit) menu_bar.add_cascade(label="File", underline=0, menu=menu_file) self.bind_all("<Control-n>", lambda x: self.do_something()) self.bind_all("<Control-o>", lambda x: self.open_file()) self.bind_all("<Control-s>", lambda x: self.do_something()) menu_edit = Menu(menu_bar, tearoff=0) menu_edit.add_command(label="Undo", command=self.do_something) menu_edit.add_separator() menu_edit.add_command(label="Copy", command=self.do_something) menu_edit.add_command(label="Cut", command=self.do_something) menu_edit.add_command(label="Paste", command=self.do_something) menu_bar.add_cascade(label="Edit", underline=0, menu=menu_edit) menu_help = Menu(menu_bar, tearoff=0) menu_help.add_command(label="About...", command=self.do_about) menu_bar.add_cascade(label="Help", underline=0, menu=menu_help) self.config(menu=menu_bar) def open_file(self): types = [("PNG image", ".png"), ("GIF image", ".gif"), ("All files", ".*")] file = askopenfilename(title="Choose the file to open", filetypes=types) print(file) def do_something(self): print("Menu clicked") def do_about(self): messagebox.showinfo("My title", "My message") window = MyWindow() window.mainloop() |
Voici le résultat produit par cette application.
Un menu déroulant peut lui-même contenir un sous-menu déroulant.
Pour ce faire, il suffit d'ajouter une nouvelle instance de la classe Menu
dans le menu déroulant considéré. Voici un exemple de code montrant cette possibilité.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
#!/usr/bin/python3 from tkinter import * from tkinter import messagebox from tkinter.filedialog import askopenfilename class MyWindow(Tk): def __init__(self): Tk.__init__(self) self.create_menu_bar() # TODO: Fill the content of the window self.geometry("300x200") self.title("My First MenuBar V1.0") def create_menu_bar(self): menu_bar = Menu(self) menu_file = Menu(menu_bar, tearoff=0) menu_file.add_command(label="New", underline=0, accelerator="CTRL+N", command=self.do_something) menu_file.add_separator() menu_file.add_command(label="Open...", underline=0, accelerator="CTRL+O", command=self.open_file) menu_file.add_command(label="Save", underline=0, accelerator="CTRL+S", command=self.do_something) menu_file.add_separator() # Un menu déroulant dans le menu File. menu_recent = Menu(menu_file, tearoff=0) menu_recent.add_command(label="File 1") menu_recent.add_command(label="File 2") menu_recent.add_command(label="File 3") menu_file.add_cascade(label="Recent files", underline=0, menu=menu_recent) menu_file.add_separator() menu_file.add_command(label="Exit", underline=1, command=self.quit) menu_bar.add_cascade(label="File", underline=0, menu=menu_file) self.bind_all("<Control-n>", lambda x: self.do_something()) self.bind_all("<Control-o>", lambda x: self.open_file()) self.bind_all("<Control-s>", lambda x: self.do_something()) menu_edit = Menu(menu_bar, tearoff=0) menu_edit.add_command(label="Undo", command=self.do_something) menu_edit.add_separator() menu_edit.add_command(label="Copy", command=self.do_something) menu_edit.add_command(label="Cut", command=self.do_something) menu_edit.add_command(label="Paste", command=self.do_something) menu_bar.add_cascade(label="Edit", underline=0, menu=menu_edit) menu_help = Menu(menu_bar, tearoff=0) menu_help.add_command(label="About...", command=self.do_about) menu_bar.add_cascade(label="Help", underline=0, menu=menu_help) self.config(menu=menu_bar) def open_file(self): file = askopenfilename(title="Choose the file to open", filetypes=[("PNG image", ".png"), ("GIF image", ".gif"), ("All files", ".*")]) print(file) def do_something(self): print("Menu clicked") def do_about(self): messagebox.showinfo("My title", "My message") window = MyWindow() window.mainloop() |
Et voici le résultat produit par cet exemple.
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :