420 likes | 557 Views
Tcl / Tk. Pour débutant … et autre Raymond Ripp. Langage de programmation généraliste interprété facile rapide moderne. Fenêtrage tout est possible facile performant robuste. Tcl / Tk. Multiplateforme … Unix, Windows, Mac … un seul programme. Tcl. Interprété
E N D
Tcl / Tk Pour débutant … et autre Raymond Ripp
Langage de programmation généraliste interprété facile rapide moderne Fenêtrage tout est possible facile performant robuste Tcl / Tk Multiplateforme … Unix, Windows, Mac … un seul programme
Tcl • Interprété • pas de compilation • peut être un langage de commande • pas de déclaration • Les points forts • chaînes de caractères • listes • adressage associatif
Fichier .tcl exécutable Par tclsh (ou wish) Une instruction par ligne ou séparées par ; ou sur plusieurs li\ gnes Un premier exemple
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 • 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} • switchstring{ 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 X 3.14 (Tcl sait que X 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}
Arrays • setM(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
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 • pour savoir si une sous-chaîne est dans une chaîne if {[regexp PetitGrand]} { bloc } Grandest 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 PetitGrand • la chaîne Grandest 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.
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
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
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 createrectangle 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
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, …
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