OPTION MENU

L'option menu est un bouton qui lors d'un clic, vous affiche un menu popup avec une liste à la manière d'un combobox. Il est très pratique pour sélectionner un item dans une liste très rapidement.

Je vous propose d'apprendre à utiliser ce widget au travers des tutoriels ci dessous.

CREER UN OPTION MENU ET RECUPERER UN ITEM DE LA LISTE

 


Dans cet exemple nous allons créer un optionmenu  et lui assigner une liste.


Quand nous cliquerons sur sur l'option menu, nous pourrons sélectionner un item de la liste et afficher la sélection dans un label.

Voici le code de l'exemple :

package require Tk

set choices {foo bar baz qux "None of the above"}
label .menuLabel -text "Make a selection: "
# "choice" is a global variable
tk_optionMenu .menu choice {*}$choices

label .displayLabel -text "You chose: "
label .display -textvariable choice

grid .menuLabel .menu
grid .displayLabel .display

Nous créons une liste nommée choices.

la ligne intéressante est celle-ci :

tk_optionMenu .menu choice {*}$choices

on crée un optionmenu nommée .menu dont la variable de sélection est choice (sans le s à choice) et qui contient la liste choices.

Au changement de la liste lors d'un clic, la valeur choice sera recopiée dans le label nommé .display avec cette ligne ci:

label .display -textvariable choice

Par contre une remarque importante, cet optionmenu n'a pas de comportement objet et dans l'état actuel, nous ne pouvons lancer une procédure au changement de sélection de l'item dans la liste.

C'est ce que nous allons détailler dans le tutoriel suivant.

 

COMPORTEMENT OBJET DU OPTIONMENU

Ce que je souhaiterais, c'est que lorsqu'on clique sur l'option menu, et que l'on sélectionne un item dans le menu, nous déclenchions une procédure dans laquelle nous pouvons changer une image, afficher l'item sélectionné etc...

En d'autre terme, lui donner un comportement objet.

Et bien voici chose faitre avec ce code ci-dessous :

Voici le code de cet exemple que nous allons commenter :

label .menuLabel -text "Sélectionnez le menu: "
tk_optionMenu .o varName "Menu A" "Menu B" "Menu C" "Menu D"
grid .menuLabel .o


for {set i 0} {$i <= [[.o cget -menu] index end]} {incr i} {
  [.o cget -menu] entryconfig $i -command {cmd $varName}
}

proc cmd {mymenu} {
	puts $mymenu }

Nous créons un tkoptionmenu nommé .o sous la variable varName avec une liste d'item (menu A à menu D) par cette ligne :

tk_optionMenu .o varName "Menu A" "Menu B" "Menu C" "Menu D"

Ensuite voici la ligne qui donne un comportement objet à notre optionmenu :

for {set i 0} {$i <= [[.o cget -menu] index end]} {incr i} {
  [.o cget -menu] entryconfig $i -command {cmd $varName}
}

Loin de moi l'idée de vous expliquer exactement cette ligne, je sais simplement qu'une sélection d'un item dans la liste déclenchera la procédure cmd avec un paramètre varName.

Ainsi écrivons une procédure cmd comme ceci :

proc cmd {mymenu} {
	puts $mymenu }

 A chaque sélection d'item dans l'optionmenu, la console affichera le nom de l'item sélectionné.

Pour aller plus loin dans cet exemple, je vous propose d'analyser le code de l'application AGANIMO, vous verrez que la sélection d'un item dans l'optionmenu déclenche la changement d'une image ainsi que le chargement d'une nouvelle liste dans une listbox.

Merci pour votre attention.

Voici le code complet de l'exemple :

label .menuLabel -text "Sélectionnez le menu: "
tk_optionMenu .o varName "Menu A" "Menu B" "Menu C" "Menu D"
grid .menuLabel .o


for {set i 0} {$i <= [[.o cget -menu] index end]} {incr i} {
  [.o cget -menu] entryconfig $i -command {cmd $varName}
}

proc cmd {mymenu} {
	puts $mymenu }

Recopiez le dans un éditeur de texte, enregistrez le fichier avec l'extention .tk et exécutéz le depuis le terminal.