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