TKTABLE


la TkTable est une table multicellule sous forme de tableau.
Il vous permet directement d'editer les champs en cliquant simplement dessus.
Il est tres simple d'utilisation.

Introduction

A) 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.

A1) description

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.

INFORMATIONs IMPORTANTEs : 

  • la premiere ligne commence par zero, la premiere colonne aussi.
  • la variable est de type globale

B) entete de la grille


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.


B1) Creation d'une table


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:

  • Dans l'entete colonne 1 : nom
  • Dans l'entete colonne 2 : prenom
  • Dans l'entete colonne 3 : date
  • Dans l'entete colonne 4 : telephone
  • Dans l'entete colonne 5 : profession
  • Dans l'entete colonne 6 : client
  • Dans l'entete colonne 7 : ville
  • Dans l'entete colonne 8 : genre

 

    •     Dans l'entete ligne nous ecrirons un numero unique qui incremente.
      Notre cahier des charges etant realise, passons a la pratique.

         Ecrivons ce code:


table .t -variable montableau -rows 6 -cols 8 
global montableau
      Explication simple :  je cree une table nommee .t et dont la variable tableau est montableau avec 6 lignes et 8 colonnes.
          A noter que cette table ne possede pas par defaut de scrollbar.
          Pour ajouter l'entete des colonnes rien de plus simple 

    set montableau(0,1) "nom" ; # ajout du texte nom a la ligne 0 (entete) et la colonne 1
     set montableau(0,2) "prenom" 
    

     , etc....
     
     pour les entetes de ligne, c'eset pareil :
     
    set montableau(1,0) "1" ; # ajout du numero 1  a la ligne 1  et la colonne 0 (entete)
      set montableau(2,0) "2"

      
      Je vous detaille de facon simple. Vous l'aurez compris, nous pouvons integrer tout cela dans des boucles for, if ou while pour simplifier le code.
      
     

    3) remplir la table

    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"
    

    4) Personnalisation de la table


    Plusieurs options s'offrent a nous pour personnaliser :

    • La police de caracteres
    • les couleurs d'arriere plan des cellules, des entetes
    • les couleurs d'avant plan.
    • Il faut utiliser les TAG.

    5) Personaliser l'entete


    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"
    


     6) Lire une valeur de la table


    Pour lire la valeur de la ligne 1 colonne 3, il suffit d'ecrire :

    puts montableau(1,3)
    

    7) definir les couleurs des cellules ou lignes.


    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

    8) un exemple avec son code

    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)"
            }
            }
    }