Tk facile - le widget listbox

 

ulis, 2006-09-24.

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


Premier script

  set ::liste [list orange banane poire abricot]
  listbox .lb -listvariable ::liste -height 4
  grid .lb

La commande listbox crée un widget listbox et une commande du nom du widget (ici .lb). En créant le widget on peut aussi préciser la valeur des options du widget. L'option -listvariable indique le nom d'un variable globale qui contient la liste à afficher. L'option -height indique le nombre de lignes visibles dans le widget.

La commande grid affiche le widget.


Sélection

Lorsqu'on sélectionne une ligne dans une listbox, celle-ci génère un évènement <<ListboxSelect>>.

  set ::liste [list orange banane poire abricot]
  listbox .lb -listvariable ::liste -height 4
  grid .lb
  bind .lb <<ListboxSelect>> \
  { tk_messageBox -message "ligne [.lb curselection]" }

La commande bind permet d'attribuer un évènement (ici <<ListboxSelect>>) à un widget (ici .lb) et de l'associer à un script.

Le script utilise l'opération curselection de la commande .lb (qui a été créée par listbox). Cette opération retourne le numéro de la ligne sélectionnée.


Sélection multiple

Le widget listbox permet plusieurs de types de sélection. Les plus utilisés sont browse (sélection simple, active par défaut) et extended (sélection multiple).

  set ::liste [list orange banane poire abricot prune raisin]
  listbox .lb -listvariable ::liste -selectmode extended
  grid .lb
  bind .lb <<ListboxSelect>> \
  { tk_messageBox -message "ligne(s) [.lb curselection]" }

C'est l'option -selectmode qui indique le type de sélection.

L'opération curselection, quant à elle, renvoie une liste de tous les numéros des lignes sélectionnées.


Ascenseurs associés

Il est possible d'associer un ascenseur (scrollbar) vertical et un ascenseur horizontal au widget listbox.

Ascenseur vertical :

  set ::liste [info vars]
  # listbox et ascenseur vertical
  listbox .lb -listvariable ::liste
  scrollbar .vs -orient vertical
  # placement
  grid .lb -row 0 -column 0
  grid .vs -row 0 -column 1 -sticky ns
  # liens
  .lb configure -yscrollcommand [list .vs set]
  .vs configure -command [list .lb yview]

Le widget scrollbar permet de choisir son orientation au moyen de l'option -orient.

La command grid place les widgets dans une grille et permet de déterminer la ligne et la colonne où se place un widget au moyen des option -row et -column.

L'opération configure des deux widgets permet de donner l'entête du script à exécuter pour contrôler/prévenir l'autre widget. Pour le widget listbox c'est l'option -yscrollcommand qui permet de donner l'entête du script. Pour le widget scrollbar c'est l'option -command qui permet de donner l'entête du script.

Lors d'évènements qui font bouger/changer l'un des deux widgets ces entêtes seront complétées par des valeurs puis exécutées.

Ascenseur horizontal :

  set ::liste [info procs]
  # widgets
  listbox .lb -listvariable ::liste -width 12
  scrollbar .hs -orient horizontal
  # placement
  grid .lb -row 0 -column 0
  grid .hs -row 1 -column 0 -sticky ew
  # liens
  .lb config -xscrollcommand [list .hs set]
  .hs config -command [list .lb xview]

L'option -width détermine la largeur du widget en fonction de la largeur moyenne d'un caractère.

Exemple complet :

  set ::liste [info procs]
  # widgets et liens
  listbox .lb -listvariable ::liste \
    -selectmode extended \
    -xscrollcommand [list .hs set] \
    -yscrollcommand [list .vs set]
  scrollbar .vs -orient vertical \
    -command [list .lb yview]
  scrollbar .hs -orient horizontal \
    -command [list .lb xview]
  # placement
  grid .lb -row 0 -column 0 -sticky nswew
  grid .vs -row 0 -column 1 -sticky ns
  grid .hs -row 1 -column 0 -sticky ew
  # sélection
  bind .lb <<ListboxSelect>> selection_lb
  proc selection_lb {} \
  {
    puts "<<ListboxSelect>> .lb"
    foreach i [.lb curselection] \
    { puts [lindex $::liste $i] }
  }
  # gonflement automatique
  grid rowconfigure . 0 -weight 1
  grid columnconfigure . 0 -weight 1

Les opération rowconfigure et columnconfigure de la commande grid permettent de dire quelle ligne ou quelle colonne de la grille des widgets profitera d'espace supplémentaire quand on agrandira l'espace de la grille.


Voir aussi


Discussion


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