Participer au site avec un Tip
Rechercher
 

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 :

Définition d'une barre de menu avec Tkinter

Le widget Entry


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

Une première barre de menu simple

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.

la méthode 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()
Une première interface graphique Tk
Vous aurez remarqué la présence des trois points successifs sur les éléments de menu « Open... » et « About... ». Ils indiquent que, si vous activez ces éléments de menu, une boîte de dialogue s'ouvrira. Cette convention se retrouve dans un très grand nombre d'interfaces graphiques.
Notez au passage la manière d'ouvrir les deux boîtes de dialogue de cet exemple.

Voici le résultat produit par cette application.

Votre première barre de menu Tkinter

Ajout d'accélérateurs et de raccourcis clavier

Un raccourci correspond à la lettre soulignée sur un élément de menu, comme le montre la capture d'écran suivante.

Une barre de menu avec des raccourcis clavier

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.

le fait d'afficher l'accélérateur ne le prend pas en charge à proprement parler. Pour que la séquence de touches lance le gestionnaire d'événements, il faut en plus invoquer la méthode 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()
Utilisation de raccourcis et d'accélérateurs.

Voici le résultat produit par cette application.

Votre première barre de menu Tkinter

Ajouter des sous-menus déroulants

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()
Exemple d'un sous-menu déroulant.

Et voici le résultat produit par cet exemple.

Votre première barre de menu Tkinter


Le widget Entry