TKTABLE
Introduction
Tout d'abord il vous faut installer le paquet tktable dans votre distribution Linux et ensuite pour pouvoir l'utiliser il faut ajouter au debut de votre programme la ligne suivante :
package require Tktable
et c'est tout! Votre tktable est prete a l'emploi.
Pour comprendre son fonctionnement il faut juste savoir que le contenu est separe de l'interface.
cela signifie simplement que tout le tableau est contenu dans une variable de type Array a deux dimension comme ceci :
variable(2,3) ; # Pointe la cellule ligne 2 colonne 3
Quant a l'interface, elle est geree comme un widget standard avec les options standard propre a tk.
Il faut juste connaitre le fonctionnement des tag. Nous en reparlerons plus bas dans ce tuto.
Comme tout tableau, vous pourrez afficher la ligne ou colonne d'entete.
En fait ce sont exactement les memes que des ligne normales. elles sont definies par un tag colonne.
Je vous explique cela plus bas.
Prenons un exemple concret.
Nous allons creer une table de dimension 6 lignes et 8 colonnes possedant une entete colonne et une entete ligne
nous allons ecrire:
table .t -variable montableau -rows 6 -cols 8 global montableau
set montableau(0,1) "nom" ; # ajout du texte nom a la ligne 0 (entete) et la colonne 1 set montableau(0,2) "prenom"
set montableau(1,0) "1" ; # ajout du numero 1 a la ligne 1 et la colonne 0 (entete) set montableau(2,0) "2"
il suffit de mettre une valeur dans la variable de type array montableau
exemple : pour afficher "HELLO" a la ligne " et la colonne 3 ecrivons ceci :
set montableau(2,3) "HELLO"
Plusieurs options s'offrent a nous pour personnaliser :
L'entete est defini par le tag title.
creons cette ligne :
t tag config title -relief groove -bg #DFDFDF -fg #000000 -font "Serif 12"
si nous executons le code, rien ne change. pourquoi?
Tout simplement car il faut dire au widget que ses premieres colonnes sont des entetes par les deux options
-titlerows : peut prendre deux etats , 0 ou 1
-titlecols : peut prendre deux etats , 0 ou 1
l'entete aura du relief par rapport a la grille, le fond etant gris et le texte noir avec une polie de taille 12.
Pour resumer tout jusqu'a maintenant, voici le code complet de notre exemple :
table .t -variable montableau -rows 6 -cols 8 -titlerows 1 -titlecols 1 .t tag config title -relief groove -bg #DFDFDF -fg #000000 -font "Serif 12" set montableau(0,1) "nom" set montableau(1,0) "1"
Pour lire la valeur de la ligne 1 colonne 3, il suffit d'ecrire :
puts montableau(1,3)
Definissons un nouveau TAG comme ceci :
.t tag config OddRow -bg #FFFFFF -fg #000000 # le fond de la table sera blanc et le texte en noir
et definissons comment doit se comporter la table avec un tag des lignes :
table .t -variable montableau -rows 6 -cols 8 -rowtagcommand rowProc
Enfin, je defini une procedure qui execute la commande de la couleur de fond :
proc rowProc row {return OddRow}
Pour etre honnette, je ne comprends pas bien comment on peut, de maniere siple, changer une couleur de cellule.
je vais y regarder de plus pres.
toujours est il que notre tableau a bien un fond blanc maintenant, CQFD.
Merci pour votre attention
Voici un exemple de code que j'ai un peu modifie extrait du site Japonais ici.
Une capture d'ecran du resultat :
et le code complet :
package require Tktable # creation de la table table .t -variable ary -rows 5 -cols 5 \ -colstretchmode unset -rowstretchmode unset \ -multiline 0 -selectmode extended \ -titlerows 1 -titlecols 0 -selecttitle 1 \ -xscrollcommand {.x set} -yscrollcommand {.y set} \ -rowtagcommand rowProc -coltagcommand colProc scrollbar .x -command {.t xview} -orient horizontal scrollbar .y -command {.t yview} -orient vertical grid .t .y -sticky news grid .x -sticky news grid rowconfigure . 0 -weight 1 grid columnconfigure . 0 -weight 1 # ajout de tag couleur .t tag config OddRow -bg #FFFFFF -fg #000000 .t tag config OddCol -bg #FFFEEE -fg pink proc rowProc row {return OddRow} proc colProc col { if {$col>0 && $col%2} { return OddCol } } # remplissage du tableau par une boucle .t tag config title -relief groove -bg #DFDFDF -fg #000000 -font "Serif 12" for {set i 0} {$i < 5} {incr i} { for {set j 0} {$j < 5} {incr j} { if {$i == 0 && $j > 0} { set ary($i,$j) [format %c [expr 64+$j]] } elseif {$j == 0 && $i > 0} { set ary($i,$j) $i } } } set ary(2,2) "Hello" set ary(0,1) "Titre" # Taille des colonne .t width 0 3
un autre exemple interessant, car il recupere les coordonnees et le texte de la cellule cliquee :
copie d'ecran :
et le code complet de l'exemple :
package require Tktable # A Tktable is a tabulator widget - it lets you # specify data to display and manage in rows and # columns from an array. array set cells { 0,1 London 0,2 Reading 0,3 Gloucester 0,4 Swindon 0,5 Bath 0,6 Chippenham 0,7 Melksham 1,0 Melksham 2,0 Trowbridge 3,0 Bath 4,0 Westbury 5,0 Frome 6,0 Weymouth 7,0 Taunton 8,0 "Dilton Marsh" 9,0 Warminster 10,0 Salisbury 11,0 Exeter 12,0 Southampton 13,0 Basingstoke } # Display the table table .mytab -rows 14 -cols 8 -variable cells pack .mytab # Add "save" and "quit" buttons button .savetext -text "Save Text" -command SaveTable button .close -text "Close" -command {exit} pack .savetext .close -padx 2m -pady 1m -side left # Define an action for the SaveTable button proc SaveTable {} { global cells; set Rows [lindex [.mytab configure -rows] end] set Cols [lindex [.mytab configure -cols] end] puts "Data is $Rows rows by $Cols columns" for {set r 1} {$r < $Rows} {incr r} { set rowname $cells($r,0) for {set c 1} {$c < $Cols} {incr c} { set colname $cells(0,$c) set cellname "$r,$c" if {![info exists cells($cellname)]} {continue} puts "{$rowname - $colname} $cellname - $cells($cellname)" } } }