Tk par l'exemple - le widget menu

 

ulis, 2006-10-14.

Exercices : copiez-collez les exemples, exécutez-les puis modifiez-les. Durée : 60 mn.


Premier script

Il s'agit d'une barre de menus.

  menu .mb
  menu .mb.file -tearoff 0
  . configure -menu .mb
  .mb add cascade -menu .mb.file -label "Fichier"
  .mb.file add command -label "Quitter" -command exit

La commande menu crée un widget menu qui peut servir à différents usages. Le premier menu créé est une barre de menus qui se met sous la barre de titre (Windows, Linux) ou dans la barre d'écran (Mac). Cette barre est alignée horizontalement. Les entrées d'une barre de menus ouvrent généralement des menus déroulants.

Ce widget menu est rattaché au widget toplevel nommé . (c'est la fenêtre principale) par l'option de configuration -menu :

  . configure -menu .mb

Un menu déroulant est aussi un widget créé par la commande menu. Le second menu qui a été créé va servir de menu déroulant. Il est aligné verticalement. L'option '-tearoff contrôle la création d'une entrée de type tearoff qui sera décrite plus loin.

La commande menu crée non seulement un widget mais aussi une commande de même nom que le widget. Cette commande permet de modifier l'aspect et le comportement du widget.

La commande .mb est associée à la barre de menus. L'opération add permet de rattacher des entrées au widget menu en précisant le type d'entrée.

A une barre de menus on rattache généralement des entrées de types cascade qui sont les menus déroulants :

  .mb add cascade -menu .mb.file -label "Fichier"

L'option -menu précise le nom du menu déroulant créé avec la commande menu. Le menu déroulant doit être un fils du menu auquel il s'attache (son chemin -ici .mb.file- commence par le chemin de son parent -ici .mb-). L'option -label précise le nom de l'entrée.

A un menu déroulant on rattache généralement des entrées de type command qui sont les entrées de menu classiques (et qui ne sont pas des widgets) :

  .mb.file add command -label "Quitter" -command exit

L'option -command définit le script à exécuter lorsque l'entrée est sélectionnée.


Barre de menus complète

  menu .mb
  menu .mb.file -tearoff 0
  menu .mb.edit -tearoff 0
  menu .mb.display -tearoff 0
  menu .mb.help -tearoff 0
  . config -menu .mb
  .mb add cascade -menu .mb.file -label "Fichier" -underline 0
  .mb.file add command -label "Nouveau" -command newFile -underline 0 -accelerator "Ctl-n"
  .mb.file add command -label "Ouvrir" -command openFile -underline 0 -accelerator "Ctl-o"
  .mb.file add command -label "Enregistrer" -command saveFile -underline 0 -accelerator "Ctl-s"
  .mb.file add command -label "Enregistrer sous..." -command saveAs -underline 12
  .mb.file add separator
  .mb.file add command -label "Quitter" -command exitFile -underline 0 -accelerator "Alt-F4"
  .mb add cascade -menu .mb.edit -label "Edition" -underline 0
  .mb.edit add command -label "Annuler" -command undo -underline 0 -accelerator "Ctl-z"
  .mb.edit add command -label "Refaire" -command redo -underline 0 -accelerator "Ctl-y"
  .mb.edit add separator
  .mb.edit add command -label "Couper" -command cutEdit -underline 2 -accelerator "Ctl-x"
  .mb.edit add command -label "Copier" -command copyEdit -underline 2 -accelerator "Ctl-c"
  .mb.edit add command -label "Coller" -command pasteEdit -underline 2 -accelerator "Ctl-v"
  .mb add cascade -menu .mb.display -label "Affichage" -underline 0
  .mb.display add checkbutton -label "Outils" -underline 0 -variable tools
  .mb.display add checkbutton -label "Statut" -underline 0 -variable status
  .mb add command -label "Aide" -underline 1 -command help
  set tools 1
  set status 0
  focus -force .
  wm geometry . =200x100

L'option -underline indique l'index du caractère qui active l'entrée. L'option -accelerator donne la description d'un accélérateur : une combinaison de touches définie par la commande bind et qui exécute un script associé (par bind) à l'entrée.

Un menu accepte des entrées de type command et de type cascade déjà vues, mais aussi de type separator, de type radiobutton et de type checkbutton. Les entrées de type checkbutton peuvent définir une variable (par l'option -variable) qui contient l'état du checkbutton.

Tous les menus peuvent contenir tous les types d'entrées. Un widget menu doit être créé pour toute entrée de type cascade.


Menu indépendant

  menu .mi -tearoff 0
  .mi add command -label "Edition" -background navy -state disabled
  .mi add command -label "Couper" -command cutEdit -underline 2
  .mi add command -label "Copier" -command copyEdit -underline 2
  .mi add command -label "Coller" -command pasteEdit -underline 2
  bind . <ButtonPress-3> {.mi post %X %Y}

Ce menu n'est pas rattaché à la fenêtre principale. Il faut utiliser son opération post pour le faire apparaître.

Une entrée de menu peut avoir le statut disabled. Dans ce cas elle n'est pas activable.


Menu détachable

Il s'agit d'une fonctionnalité qui a eu son heure de gloire avec Motif et NextStep (au millénaire précédent). Lorsque l'on sélectionne les pointillés, le menu déroulant est dupliqué en son équivalent menu indépendant puis affiché dans une fenêtre complète.

  menu .mb
  menu .mb.edit -tearoff 1
  . config -menu .mb
  .mb add cascade -menu .mb.edit -label "Edition" -underline 0
  .mb.edit add command -label "Couper" -command cutEdit -underline 2
  .mb.edit add command -label "Copier" -command copyEdit -underline 2
  .mb.edit add command -label "Coller" -command pasteEdit -underline 2

C'est l'option -tearoff 1 qui crée l'entrée avec les pointillés.


Menu bouton

Il est possible de rattacher un menu à un bouton.

  menubutton .mb -text Menu -menu .mb.edit -indicator 1
  grid .mb
  menu .mb.edit -tearoff 1
  .mb.edit add command -label "Couper" -command cutEdit -underline 2
  .mb.edit add command -label "Copier" -command copyEdit -underline 2
  .mb.edit add command -label "Coller" -command pasteEdit -underline 2

L'option -indicator 1 du widget menubutton fait apparaître un petit rectangle en relief.


Pour les fainéants (comme moi)

ulis : voici maintenant un exercice de paresse : une procédure qui fait automatiquement le travail !

A modifier, comme les autres...

  proc menues {menues} \
  {
    . config -menu [menu .menues]
    set id 0
    foreach {name cascade} $menues \
    {
      set n [string first & $name]
      set label $name
      if {$n == 0} \
      { set label [string range $name 1 end] } \
      elseif {$n > 0} \
      {
        set label [string range $name 0 [expr {$n - 1}]]
        append label [string range $name [expr {$n + 1} end]]
      }
      set menu .menues.menu[incr id]
      .menues add cascade -label $label -underline $n -menu [menu $menu -tearoff 0]
      foreach command $cascade \
      {
        foreach {name script key} $command \
        {
          set n [string first & $name]
          set label $name
          if {$n == 0} \
          { set label [string range $name 1 end] } \
          elseif {$n > 0} \
          {
            set label [string range $name 0 [expr {$n - 1}]]
            append label [string range $name [expr {$n + 1}] end]
          }
        }
        if {$label == "-"} \
        { $menu add separator } \
        else \
        {
          $menu add command -label $label -underline $n -command $script -accelerator $key
          if {$key != ""} \
          {
            set key [string tolower $key]
            set map [list]
            lappend map ctrl Control ctl Control ctr Control
            lappend map shft Shift sht Shift shf Shift
            lappend map f1 F1 f2 F2 f3 F3 f4 F4 f5 F5 f6 F6
            lappend map f7 F7 f8 F8 f9 F9 f10 F10 f11 F11 f12 F12
            bind . <[string map $map $key]> $script
          }
        }
     }
   }
 }
 set menues \
 {
   "&Game"
   {
     { "&New game" {StartGame}   F2     }
     { "&Restart"  {StartGame 1}        }
     { -                                }
     { "&Undo"     {Undo}        Ctrl-z }
     { -                                }
     { "E&xit"     {exit}               }
   }
   "&Help"
   {
     { "&Help"     {Help}        F1     }
     { "&About"    {About}              }
   }
 }
 package require Tk
 menues $menues
 focus -force .

Voir aussi


Discussion


Catégorie Cours | Catégorie Encyclopédie Tk