Pour débutant … et autre Raymond Ripp Tcl / Tk Pour débutant … et autre Raymond Ripp Ce séminaire sur Tcl/Tk s'adresse aux débutants en Tcl ... mais il faut avoir des notions de programmation. Nous verrons d’abord le langage de rogrammation Tcl qui est un langage de script comme csh ou tcsh, puis nous aborderons Tk, qui permet de créer et de gèrer un sytème de fenêtrage avec petits dessins, ascenceur et gstion de la souris et du clavier.
Multiplateforme … Unix, Windows, Mac Tcl / Tk Langage de programmation généraliste interprété facile rapide moderne Fenêtrage tout est possible facile performant robuste Multiplateforme … Unix, Windows, Mac … un seul programme
Tcl Interprété Les points forts pas de compilation peut être un langage de commande pas de déclaration Les points forts chaînes de caractères listes adressage associatif
Un premier exemple Fichier .tcl exécutable Par tclsh (ou wish) Une instruction par ligne ou séparées par ; ou sur plusieurs li\ gnes
Les variables Identificateur d’une variable toto X11 prix_max PrixMax prixMax Type d’une variable (non déclaré) String (vraie chaîne de caractères ou nombre) List (de String ou de List) Array Affectation set toto 25 Par une procédure CalAff toto 89 $X11 Accès à la valeur $toto [set toto]
Les fonctions proc Moyenne {A B} { return [expr ($A+$B)/2] } set X 12 (X=12) set M [Moyenne $X 26] (M=19) set Y $X (Y=12) set Y [set X] (Y=12) proc Calculons {X Y aZ} { upvar $aZ Z set Z [expr $X+$Y] Calculons $X 78 Oscar (Oscar = X+78)
Les arguments sont transmis par valeur ne peuvent être modifiés que Moyenne $X 26 si c’est une variable ou une constante Calculons $X 78 Oscar la procédure reçoit la valeur de X, le nombre 78 et la chaîne de caractères Oscar par upvar $aZ Z elle sait que aZ est l ’adresse d ’une variable, qui localement s ’appelle Z ne peuvent être modifiés que s’il y a upvar ...
Return d’une procédure return (ne retourne rien) return 1789 (retourne 1789) proc Sommons {A B} { return [expr $A+$B]} retourne la somme Que peut-on retourner : une valeur (chaîne ou nombre) une liste (de n ’importe quoi : valeur ou listes ) … mais pas de array
Les instructions de contrôle if {expression} {blocV} else {blocF} while {expression} {bloc} for {init} {expression} {increm} {bloc} foreach a $Liste {bloc} foreach a $ListeA b $ListeB {bloc} foreach {a b} $Liste {bloc} switch string { pattern1 {bloc} pattern2 {bloc2} ... } continue, break, return, exit
Les chaînes de caractères set J “Bonjour” set Mme “Madame” set S “Bonsoir $Mme” append S “ Durand” set Texte “$S,\nje vous écris …” set Pi 3.14 (Tcl sait que Pi est aussi un nombre) Tout est chaîne. Les fonctions associées ...
Fonctions de traitement des chaînes de caractères append S “, merci.” set C [string index $Tout 3] set S [string range $Tout 3 end] set S [string toupper “Salut”] (tolower,totitle) set S [string repeat “bravo” 20] set i [string first o “non ou non” 3] set i [string last o “non ou non” 3] string trim $S “c” (trimleft trimright) set A [string replace $S 2 5 “AB”] set L [string length $S] string compare string equal etc.
Les listes set L {a b c d e} set L [list 3 $X $Y 35] lappend L 56 <<<< pas de $ set T [lsort $L] set Petit [lrange $Grand 4 end] set Element [lindex $L 3] set NouvListe [linsert $Liste 2 $X $Y] set AB [concat $ListeA $ListeB] set n [llength $Liste] set Texte [join $Lignes “\n”] set Lignes [split $Texte “\n”] foreach Element $Liste { bloc }
Tableau(Chaine) <--> Valeur Arrays set M(2,4)45 … comme une matrice … set S [expr $M(2,4)+8] set M($i,3) 56 set Prenom(Ripp) “Raymond” set Bureau(Raymond Ripp) 0086 Tableau(Chaine) <--> Valeur
“adressage par le contenu” Arrays (suite) … vraiment, vraiment pratique !!! rapide, facile, sûr, … c’est magique : en particulier pour l’adressage associatif … “adressage par le contenu”
L’adressage associatif foreach Ligne [DuFichier “/home/ripp/labo”] { scan $Ligne “%s %s %s” S N P set MmeMllM($N) $S set PrenomDe($N) $P lappend LesNomsDe($P) $N } set Nom [Question “Votre nom :”] puts “$MmeMllM($Nom) $PrenomDe($Nom) $Nom, …” puts “Les personnes se prénommant Nicolas sont : ” puts [join $LesNomsDe(Nicolas) “\n”] c’est surtout très rapide
L’adressage associatif (suite) proc Badge X { global Memo if {[info exists Memo($X)]} { return $Memo($X) } if {[info exists Memo(Bidon)]} { return “” } foreach Ligne [DuFichier “/usr/badge”] { scan $Ligne “%s %s” N B set Memo($N) $B set Memo($B) $N set Memo(Bidon) Nodin return [Badge $X]
Expressions régulières un don du ciel très simples pour des problèmes simples simple pour le reste … quand on a compris ! vous ne pourrez plus vous en passer ! … on y va ?
regexp Grand est une chaîne de caractères pour savoir si une sous-chaîne est dans une chaîne if {[regexp Petit Grand]} { bloc } Grand est une chaîne de caractères Petit une expression régulière qui définit très précisément ce qu’on recherche ...
regexp Petit Grand la chaîne Grand est normale Petit est une expression régulière une simple chaîne : regexp ymo Raymond … regexp {^R[a-z]+$} Raymond là où ça se corse c ’est quand il faut mettre des [, des ], des $, des *, ou autres … exercice pour l ’obtention du prix Nobel en informatique: écrire l ’expression régulière d ’une expression régulière correcte.
regexp : caractères backslashés \+*.,[]{}()- ont une signification spécifique. Les backslasher pour les utiliser tels quels : regexp {a\*x\+b} $Formule \n \t ... ont une signification standardisée
Tk, l’interface graphique se programme en Tcl les widgets (WIndows gaDGETS) : fenêtres, boutons, cadres, ascenseurs, … sont des objets que l ’on crée qui ont leur vie qui communiquent un manager les organise, les rend visibles, actifs, il gère les interactions avec la souris, le clavier.
Un widget est fait de widgets Hiérachie des widgets Il y a des fenêtres dans des fenêtres, des boutons, des ascenseurs, etc. Un widget est fait de widgets la notation arborescente ... .choix.liste .choix.boutons.accepte .choix.boutons.abandonne … induit la hiérarchie Il n’y a plus qu’à construire :
Les éléments de base frames : ce sont des cadres, des conteneurs toplevel frame affichage et manipulation de textes text listbox message entry label boutons et ascenseurs button scrollbar checkbutton radiob. dessins et photos canvas image photo bitmap menus menu menubutton
TypeDeWidget NomduWidget -option valeur -option valeur … Création toplevel .t1 frame .t1.f frame .t1.f.g canvas .t1.f.g.c -width 1024 scrollbar .t1.f.hor -orient horizontal TypeDeWidget NomduWidget -option valeur -option valeur … set Chevalet .t1 ; … ; set Toile $Tout.f.g.c toplevel $Chevalet canvas $Toile -width $LargeurToile listbox $Palette
NomduWidget configure -option valeur -option valeur … Configuration 1/3 .t1.f.g.c configure -height 768 $Chevalet configure -background white NomduWidget configure -option valeur -option valeur … et pour obtenir les valeurs : set LaConfig [.a.b.c configure] (pour tout) set LeFond [.a.b.c configure -background]
Configuration 2/3 STANDARD OPTIONS -activebackground, activeBackground, Foreground -background or -bg, background, Background -borderwidth or -bd, borderWidth, BorderWidth -cursor, cursor, Cursor -highlightbackground, highlightBackground, HighlightBackground -highlightcolor, highlightColor, HighlightColor -highlightthickness, highlightThickness, HighlightThickness -jump, jump, Jump -orient, orient, Orient -relief, relief, Relief -repeatdelay, repeatDelay, RepeatDelay -repeatinterval, repeatInterval, RepeatInterval -takefocus, takeFocus, TakeFocus -troughcolor, troughColor, Background … et il y en a encore … et des spécifiques à chaque widget.
Configuration 3/3 … vous avez remarqué que un widget $w, une fois créé, EST une fonction tcl. Cette fonction permet de modifier le widget : $w configure -option valeur de l‘interroger : [$w configure -option] Elle sert, en fait, à plein d’autres choses : $w create rectangle 10 10 200 300 -fill red ...
Organisation géométrique pack $w.buttons -side bottom -fill x positionne la boite à côté ou au dessus des autres place -x 10 -y 20 $w.truc la place à un endroit précis en x,y grid .w.scrover -row 0 -column 1 sur une grille Seules ces commandes et toplevel provoquent l’affichage
Exemples
Exemples 2
Exemples 2 bis
Exemples 3 avec args
Exemples 3 avec args bis
Lecture d’un fichier Il faut des règles concernant le contenu ligne par ligne, 1 prénom (avec - ), 1 nom, etc. attention aux lignes vides caractère séparateur : un ou plusieurs, espace ou tabulation, …
Utilisation des tableaux associatifs
Appel récursif
Tclsh ou Wish en Unix ou Windows Un fichier .tcl Double-clic du fichier Attention puts ne marche car il n’y a pas de console Lancer wish source fifi.tcl Utiliser Tk source gscope_outils.tcl http://www-bio3d-igbmc.u-strasbg.fr/~ripp
à suivre …