tcl / tk
DESCRIPTION
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é - PowerPoint PPT PresentationTRANSCRIPT
Tcl / Tk
Pour débutant … et autre
Raymond Ripp
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é– 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
– 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 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
• 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
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 Pset MmeMllM($N) $Sset PrenomDe($N) $Plappend 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 Memoif {[info exists Memo($X)]} {
return $Memo($X)}if {[info exists Memo(Bidon)]} { return “” }
foreach Ligne [DuFichier “/usr/badge”] {scan $Ligne “%s %s” N Bset Memo($N) $Bset Memo($B) $N
}set Memo(Bidon) Nodinreturn [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 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.
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 conteneurstoplevel frame
• affichage et manipulation de textestext listbox message entry label
• boutons et ascenseursbutton scrollbar checkbutton radiob.
• dessins et photoscanvas image photo bitmap
• menusmenu menubutton
Créationtoplevel .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 create rectangle 10 10 200 300 -fill red
...
Organisation géométrique
• pack $w.buttons -side bottom -fill xpositionne la boite à côté ou au dessus des autres
• place -x 10 -y 20 $w.trucla 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 …