Gestion des menus
La classe Application fournit une référence sur le menu TkInter via l'attribut self.menu. Cet attribut est une instance de la classe tk.Menu.
De ce fait, la modification ou l'extension du menu peut être effectuée par programmation Python, via les primitives de TkInter.
Cependant, les menus d'une application fenêtrée sont essenciellement contitués de texte, et donc soumis potentiellement à une localisation dans une langue ou dans une autre.
C'est pourquoi nous avons pris le parti d'embarquer la structure des menus dans le fichier de localisation.
Et de fournir une méthode self.parseMenu() qui analyse le fichier de localisation pour créer les instances Python de la barre de menu.
Fichier de localisation
Comme indiqué dans l'article sur la localisation des applications,
le fichier de localisation est un fichier structuré en JSON et les élements constituant la barre de menus se trouve dans la rubrique "menu".
Au vu du nombre de paramètres à fournir aux primitives de TkInter, la structure de cette rubrique est assez complexe et nécessite une description précise
pour que la méthode self.paseMenu() puisse fonctionner correctement.
Structure de la rubrique "menu"
Pour l'exemple, c'est la version française de fr.json qui va être utilisée. Mais il convient de maintenir en parallèle toutes les versions pour assurer un
fonctionnement identique de l'application dans totues les langues.
"menu":
[
{
"title" : "Fichier",
"ul" : "0",
"options" :
[
{ "type" : "command", "title" : "Nouveau...", "ul" : "0", "command" : "menu_file_new", "icon" : "icon_menu_file_new16.png",
"accel" : ["Ctrl+N", "<Control-KeyPress-n>", "<Control-KeyPress-N>"] },
{ "type" : "command", "title" : "Ouvrir...", "ul" : "0", "command" : "menu_file_open", "icon" : "icon_menu_file_open16.png",
"accel" : ["Ctrl+O", "<Control-KeyPress-o>", "<Control-KeyPress-O>"] },
{ "type" : "command", "title" : "Enregistrer sous...", "ul" : "5", "command" : "menu_file_save_as", "icon" : "icon_menu_file_save_as16.png",
"accel" : ["Ctrl+Alt+S", "<Control-Alt-KeyPress-s>", "<Control-Alt-KeyPress-S>"] },
{ "type" : "command", "title" : "Enregistrer", "ul" : "0", "command" : "menu_file_save", "icon" : "icon_menu_file_save16.png",
"accel" : ["Ctrl+S", "<Control-KeyPress-s>", "<Control-KeyPress-S>"] },
{ "type" : "separator" },
{ "type" : "command", "title" : "Imprimer...", "ul" : "0", "command" : "menu_file_print", "icon" : "icon_menu_file_print16.png",
"accel" : ["Ctrl+P", "<Control-KeyPress-p>", "<Control-KeyPress-P>"] },
{ "type" : "command", "title" : "Mise en page...", "ul" : "0" , "command" : "menu_file_print_preview", "icon" : "icon_menu_page_setup16.png" },
{ "type" : "separator" },
{ "type" : "command", "title" : "Quitter", "ul" : "0", "command" : "menu_application_exit", "icon" : "icon_menu_app_exit16.png",
"accel" : ["Alt+F4", "<Alt-F4>"] }
]
},
{
"title" : "Edition",
"ul" : "0",
"options" :
[
{ "type" : "command", "title" : "Annuler", "ul" : "0", "command" : "menu_edit_undo", "icon" : "icon_menu_edit_undo16.png",
"accel" : ["Ctrl+Z", "<Control-KeyPress-z>", "<Control-KeyPress-Z>"] },
{ "type" : "command", "title" : "Rétablir", "ul" : "0", "command" : "menu_edit_redo", "icon" : "icon_menu_edit_redo16.png",
"accel" : ["Ctrl+Y", "<Control-KeyPress-y>", "<Control-KeyPress-Y>"] },
{ "type" : "separator" },
{ "type" : "command", "title" : "Couper", "ul" : "3", "command" : "menu_edit_cut", "icon" : "icon_menu_edit_cut16.png",
"accel" : ["Ctrl+X", "<Control-KeyPress-x>", "<Control-KeyPress-X>"] },
{ "type" : "command", "title" : "Copier", "ul" : "0", "command" : "menu_edit_copy", "icon" : "icon_menu_edit_copy16.png",
"accel" : ["Ctrl+C", "<Control-KeyPress-c>", "<Control-KeyPress-C>"] },
{ "type" : "command", "title" : "Coller", "ul" : "0", "command" : "menu_edit_paste", "icon" : "icon_menu_edit_paste16.png",
"accel" : ["Ctrl+V", "<Control-KeyPress-y>", "<Control-KeyPress-Vgt;"] },
{ "type" : "separator" },
{ "type" : "command", "title" : "Supprimer", "ul" : "0", "command" : "menu_edit_delete", "icon" : "icon_menu_edit_delete16.png",
"accel" : ["SUP", "<Delete>"] },
{ "type" : "command", "title" : "Selectionner tout", "ul" : "13", "command" : "menu_edit_select_all", "icon" : "icon_menu_edit_select_all16.png",
"accel" : ["Ctrl+A", "<Control-KeyPress-a>", "<Control-KeyPress-Agt;"] }
]
},
{
"title": "Aide",
"ul" : 0,
"options" :
[
{ "type" : "command", "title" : "Aide...", "ul" : "0" , "accel" : ["F1", "<F1>"] , "command" : "menu_help" },
{ "type" : "separator" },
{ "type" : "command", "title" : "A propos de...", "ul" : "2" , "command" : "menu_about" }
]
}
],
[
{
"title" : "Fichier",
"ul" : "0",
"options" :
[
{ "type" : "command", "title" : "Nouveau...", "ul" : "0", "command" : "menu_file_new", "icon" : "icon_menu_file_new16.png",
"accel" : ["Ctrl+N", "<Control-KeyPress-n>", "<Control-KeyPress-N>"] },
{ "type" : "command", "title" : "Ouvrir...", "ul" : "0", "command" : "menu_file_open", "icon" : "icon_menu_file_open16.png",
"accel" : ["Ctrl+O", "<Control-KeyPress-o>", "<Control-KeyPress-O>"] },
{ "type" : "command", "title" : "Enregistrer sous...", "ul" : "5", "command" : "menu_file_save_as", "icon" : "icon_menu_file_save_as16.png",
"accel" : ["Ctrl+Alt+S", "<Control-Alt-KeyPress-s>", "<Control-Alt-KeyPress-S>"] },
{ "type" : "command", "title" : "Enregistrer", "ul" : "0", "command" : "menu_file_save", "icon" : "icon_menu_file_save16.png",
"accel" : ["Ctrl+S", "<Control-KeyPress-s>", "<Control-KeyPress-S>"] },
{ "type" : "separator" },
{ "type" : "command", "title" : "Imprimer...", "ul" : "0", "command" : "menu_file_print", "icon" : "icon_menu_file_print16.png",
"accel" : ["Ctrl+P", "<Control-KeyPress-p>", "<Control-KeyPress-P>"] },
{ "type" : "command", "title" : "Mise en page...", "ul" : "0" , "command" : "menu_file_print_preview", "icon" : "icon_menu_page_setup16.png" },
{ "type" : "separator" },
{ "type" : "command", "title" : "Quitter", "ul" : "0", "command" : "menu_application_exit", "icon" : "icon_menu_app_exit16.png",
"accel" : ["Alt+F4", "<Alt-F4>"] }
]
},
{
"title" : "Edition",
"ul" : "0",
"options" :
[
{ "type" : "command", "title" : "Annuler", "ul" : "0", "command" : "menu_edit_undo", "icon" : "icon_menu_edit_undo16.png",
"accel" : ["Ctrl+Z", "<Control-KeyPress-z>", "<Control-KeyPress-Z>"] },
{ "type" : "command", "title" : "Rétablir", "ul" : "0", "command" : "menu_edit_redo", "icon" : "icon_menu_edit_redo16.png",
"accel" : ["Ctrl+Y", "<Control-KeyPress-y>", "<Control-KeyPress-Y>"] },
{ "type" : "separator" },
{ "type" : "command", "title" : "Couper", "ul" : "3", "command" : "menu_edit_cut", "icon" : "icon_menu_edit_cut16.png",
"accel" : ["Ctrl+X", "<Control-KeyPress-x>", "<Control-KeyPress-X>"] },
{ "type" : "command", "title" : "Copier", "ul" : "0", "command" : "menu_edit_copy", "icon" : "icon_menu_edit_copy16.png",
"accel" : ["Ctrl+C", "<Control-KeyPress-c>", "<Control-KeyPress-C>"] },
{ "type" : "command", "title" : "Coller", "ul" : "0", "command" : "menu_edit_paste", "icon" : "icon_menu_edit_paste16.png",
"accel" : ["Ctrl+V", "<Control-KeyPress-y>", "<Control-KeyPress-Vgt;"] },
{ "type" : "separator" },
{ "type" : "command", "title" : "Supprimer", "ul" : "0", "command" : "menu_edit_delete", "icon" : "icon_menu_edit_delete16.png",
"accel" : ["SUP", "<Delete>"] },
{ "type" : "command", "title" : "Selectionner tout", "ul" : "13", "command" : "menu_edit_select_all", "icon" : "icon_menu_edit_select_all16.png",
"accel" : ["Ctrl+A", "<Control-KeyPress-a>", "<Control-KeyPress-Agt;"] }
]
},
{
"title": "Aide",
"ul" : 0,
"options" :
[
{ "type" : "command", "title" : "Aide...", "ul" : "0" , "accel" : ["F1", "<F1>"] , "command" : "menu_help" },
{ "type" : "separator" },
{ "type" : "command", "title" : "A propos de...", "ul" : "2" , "command" : "menu_about" }
]
}
],
Données relatives à la barre de menus
Selon l'environnement technique utilisé, cette barre peut se situer à des endroits différents. Sous Windows, par exemple, elle est embarquée dans la fenêtre principale de l'application
et se situe en haut de celle-ci. Sur Mac-OS, la barre de menu se situe en haut de l'écran et son affichage dépend de l'application en cours d'utilisation.
La barre de menu est constituée de plusieurs menus et, au repos, n'affiche que les titres de ceux-ci. Elle est représentée dans le fichier JSON par la rubrique "menu".
La rubrique "menu" est bornée par les caractères [..]. En JSON, c'est donc un tableau dont les éléments sont indexés numériquement par leur rang en commençant par 0.
En effet, une barre de menu est constitue de plusieurs menus. L'ordre d'affichage de ces menus étant déterminant, un tableau est préférable au dictionnaire dont l'ordre d'itération
est soumis aux aléas du hachage des clefs.
Données relatives à chaque menu
En revanche, chaque élément du tableau, qui correspond à un menu donné, est borné par les caractères {..}. Il s'agit donc d'un dictionnaire composé d'élements (clef:valeur)
Chaque menu comporte trois élements :
| Clef | Valeur |
|---|---|
| title | Titre du menu affiché dans la barre de menus lorsqu'elle est au repos. |
| ul | Position du caractère souligné (à partir de 0). |
| options | Tableau des options du menu. |
La position du caractère souligné est importante, car elle permet de piloter le menu uniquement par le clavier sans utilser la souris.
L'affichage de ces caractères se déclenche par une touche particulière. Sous Windows, il s'agit de la touche [Alt].
Il est préférable qu'elle soit unique. Quoique, si plusieurs menus disposent du même caractère souligné, la répétition de la touche
permet de passer d'un menu à l'autre.
Par exemple, la position "ul" du caractère souligné du menu "Fichier" a pour valeur "0". C'est donc le premier caractère F qui sera souligné.
A remarquer que dans les fichiers JSON, le paramètres numériques sont aussi indiqués entre guillemets.
L'élement "options" est borné par les caractères [...]. Il s'agit donc à nouveau d'un tableau.C'est normal puisque l'ordre d'affichage des options d'un menu est aussi déterminant.
Données relatives à chaque option de menu
Chaque option du menu est bornée par les caractères {...}. Il s'agit donc encore d'un dictionnaire. Les éléments de ce dictionnaire sont les paramètres de la primitive menu.add() de TkInter.
| Clef | Valeur |
|---|---|
| type | Type d'option. Il correspond au paramètre kind de la primitive .add() de TkInter. |
| title | Texte de l'option affiché dans le menus. |
| ul | Position du caractère souligné (à partir de 0). |
| command | Méthode déclenchée lorsque l'utilisateur clique sur l'option. |
| icon | Clef de l'icône dans le dictionnaire des ressources. |
| accel | Tableau des racourcis. |
| submenu | Dictionnaire contenant les éléments d'un sous- menu lorsque l'option est de type "cascade". |
Le paramètre type correspond au type d'option. En effet, TkInter permet de distinguer cinq types d'option :
- command - C'est l'option standard. Lorsque l'utilisateur clique cette option, cela déclenche une action.
- separator - Comme son nom l'indique, il s'agit de separer plusieurs groupes d'options. Cette option est inerte. Elle s'affiche sous la forme d'un trait dans le menu.
- checkbutton - Une case à cocher est affichée à gauche du texte de l'option.
- radiobutton - Un bouton radio est affiché à gauche du texte de l'option. Cliquer un bouton radio invalide tous les autres du même groupe.
- cascade - Cliquer l'option déclenche l'affichage d'un sous-menu.
Le paramètre command ne concerne que les options de type "command", celle que l'utilisateur clique pour déclencher une action.
Le paramètre submenu ne concerne que les options de type "cascade". C'est un dictionnaire, donc borné par {...}, dont la structure est identique aux menus de premier niveau.
Le format JSON du fichier de localisation permet d'imbriquer ainsi autant de niveau de menu que désiré. Cependant, il est déconseiller d'imbriquer plus de deux niveau
pour conserver une visibilité acceptable des fonctionnalités de l'application.
L'icône est affichée à gauche du texte de l'option. Le fichier de l'image doit être au format 16x16 pixels pour ne pas altérer l'affichage du menu et doit se trouver
dans le répertoire des images chargé par la méthode loadResources() de la classe Application.
Le paramètre accel est un tableau pour implémenter les raccourcis clavier des commandes.
Le premier élément (indicé 0) correspond à ce qui va être affiché à droite de l'option.
Les autres éléments du tableau sont une liste d'événement clavier qui seront liés par une invocation à la méthode bind_all() de TkInter.
Les événement sont exprimés selon la syntaxe de TkInter.
Par exemple, le raccourcis clavier de la commande Edition/Annuler est Ctrl+Z. Mais elle nécessite de lier deux événements TkInter
<Control-KeyPress-z> et <Control-KeyPress-Z> pour qu'elle puisse fonctionner que le clavier soit configuré en minuscules ou en majuscules.
L'avantage de faire figurer ces éléments dans le fichier de localisation est que l'on peut distinguer la représentation
de certaines touches selon les langues. Par exemple, le raccourcis clavier de la commande Edition/Supprimer est la touche [Sup] ou [Suppr] sur les
claviers français, mais c'est la touche [Del] sur les claviers anglo-saxons. Cependant toutes génèrent le même événement TkInter <Delete>.
Commentaires
Enregistrer un commentaire