Title: Cours TclTk
1Cours Tcl/Tk
- Marcela Hernández Hoyos
- CREATIS
- Décembre 1999
2Contenu
- Quest-ce que cest ?
- Pourquoi Tcl/Tk?
- Comment démarrer
- Documentation
- Syntaxe
- Trois parties
- Tcl
- Tk
- Tcl/Tk C/C
3Quest-ce que cest ?
Tcl / Tk
Ffqfqs fsdfqdf dfqsdf fsdfqsdsqs dsqdqsd
dqsdqd qdsdsqdq sdqsdqsd qdqsdq qdsdqsd
qdqdsqd qdqsdqsd qdqsdq Ffqfqs fsdfqdf dfqsdf
fsdfqsdsqs dsqdqsd dqsdqd qdsdsqdq sdqsdqsd
qdqsdqsdq sdqsdq qdqsdqdq qdq qdsdqsd qdqdsqd
qdqsdqsd qdqsdq Ffqfqs fsdfqdf dfqsdf
fsdfqsdsqs dsqdqsd dqsdqd qdsdsqdq sdqsdqsd
qdqsdqsdq sdqsdq qdqsdqd qdsdqsd qdqdsqd
qdqsdqsd qdqsdq f
- Tool Command Language
- Langage de commandes (shell)
- Tcl librairie de commandes C interpréteur
de commandes - Programmation séquentielle
- Tclsh
- Tool Kit
- Extension de Tcl pour la partie application
graphique - fenêtres
- menus
- butons,
- Programmation événementielle
- Wish
4Pourquoi Tcl/Tk ?
- Syntaxe simple et richesse des commandes de base
- Langage interprété ?pas de compilation
- Gratuit - Internet
- Portabilité
- Unix linux
- PC Windows et Windows NT
- MacIntosh
- Outils de haut niveau pour la partie graphique
(Tk) - Extensibilité
- Nombreuses extensions disponibles expect, itcl,
BLT, ...
5Comment démarrer ?
- Interactivement
- tclsh -gt Tcl
- wish -gt Tcl/Tk
- Exemple
- wish
- button .button -test Essai -command exit
- pack .button
- Sous forme de scripts
- Exemple essai.tcl
- essai.tcl
- button .button -text "Essai 2" -command exit
- pack .button
- wish80 essai.tcl
6Documentation
7Documentation
- En ligne
- Tutorial Tcl tcltutor (CD livre Flynt)
- Exemples Tk C\Program Files\Tcl\lib\tk8.0\dem
os - WWW
- Fichiers
- http//www.scriptics.com/products/tcltk/
- Information
- http//hegel.ittc.ukans.edu/topics/tcltk/
- http//www.sco.com/Technology/tcl/Tcl.html
- Manuel
- http//www.scriptics.com/man/tcl8.0/contents.htm
8Syntaxe utilisée dans ces notes
- ?aaa? aaa est optionnel
- commande erronée (erreur à ne pas faire)
- gt le résultat dune commande tcl
- commande tcl/tk
9Première partie Tcl
10Tcl Tool Command Language
- Introduction au langage
- Variables
- Exécution d'une commande
- Opérations mathématiques
- Structures de contrôle
- Procédures
- Portée des variables
- Chaînes de caractères
- Structures de données
- Evaluation de commandes
- Programmation modulaire
11Introduction au langage
- Tcl ne manipule que des chaînes de caractères
strings - Conversion numérique
- Opérations mathématiques
- Comparaisons
- Syntaxe
- command arg1 arg2 ?arg3 .argn? ?args?
- command commande intrinsèque built-in ou
procédure - arguments chaîne de caractères !
- séparateur entre commandes et arguments espace
ou tabulation - séparateur entre commandes retour à la ligne ou
12Variables
- puts
- puts var
- puts "chaine"
- set var1 20
- set var2 var1
- set var3 aaavar1
- set var4 var1aaa gt erreur
-
- puts var1 gt 20
- puts var2 gt 20
- puts var3 gt aaa20
- set txt "Les variables var1 et var2 ont la même
valeur " - puts "txt var1 var2"
- gt Les variables var1 et var2 ont la même valeur
20 20 -
13Exécution d'une commande
- 1er mot commande
- Vérification commande existe
- Autres mots arguments passés à la commande
- 1 groupement d'arguments 1 seul argument
- Pas de sens appliqué aux mots
- Substitutions
- var
- \a \b \f \n \t
- \nouvelle ligne
- Groupements
- " "
-
-
14Groupement avec " "
- Permet des substitutions à l'intérieur des " "
- set Z "Bogota"
- set Z_LABEL "La capitale de Colombie est "
- puts "Z_LABEL Z"
- gt La capitale de Colombie est Bogota
- Pour empêcher la substitution \
- puts "Z_LABEL \Z"
- gt La capitale de Colombie est Z
- Sauf
- \a \b \n \t
- \nouvelle ligne
15Groupement avec
- Empêche les substitutions à l'intérieur des
- set Z "Bogota"
- set Z_LABEL "La capitale de Colombie est "
- puts Z_LABEL Z
- gt Z_LABEL Z
- Sauf
- \nouvelle ligne
- Et si ...
" "
vil caractère ascii
puts "Z_LABEL Z" gt La capitale de Colombie
est Bogota
16Groupement avec
- commande arg1 arg2 arg3
- résultat de la commande ?
appel à une fonction
set x 2 set y 5 set z expr x y puts z
gt 10
set y set x "def" puts "set retourne la valeur
de la variable X x Y y" gt set retourne la
valeur de la variable X def Y def
17Opérations mathématiques
- Commande expr opérande opérateur opérande
- Opérandes
- Valeurs numériques
- Opérateurs
- cos, sin, tan
- acos, asin, atan
set pi expr 2asin(1.0) gt 3.141592
18Structures de contrôle - if switch
- if - Comparaison numérique
- if test1 ... elseif test2 ... else ...
- switch - Comparaison textuelle
- switch ?options? string pattern1 corps1 pattern2
corps2 ... patternN corpsN - switch ?options? string
- pattern1 corps1
- pattern2 corps2
- default corpsD
-
- options -exact, -glob, -regexp, -- (fin
d'options)
set x "ONE" switch x \ "ONE"
"puts ONE1" \ "TWO" "puts TWO2" \
"default" "puts NO_MATCH"
gt ONE1
19Structures de contrôle - while for
- while
- while test
- set i 10
- while i gt 0
- puts i
- incr i -1
-
- for
- for init test reinit
- exécuter init puis
- si test est vrai, exécuter puis reinit, et
ainsi de suite jusqu à test est faux - for set i 0 i lt 10 incr i
- puts i
20Procédures
- Commande proc
- proc name ?param1? ?? ?paramn? ?args? body
- name le nom de la procédure
- params la liste des paramètres avec des valeurs
par défaut possibles - proc test a b 7 c toto
- puts "a b c"
-
- test Bonjour gt Bonjour 7 toto
- test Bonjour cher gt Bonjour cher toto
- si le dernier paramètre s'appelle args, il est
interprété comme une liste ce qui permet de
passer un nombre variable de paramètres - valeur retournée par une procédure soit le
résultat de la dernière commande exécutée, soit
return returnValue
21Portée des variables
- Variables locales
- Définies dans une procédure ? locales à la
procédure - Variables globales
- Définies en dehors de toute procédure
- global x
- x est maintenant une variable globale dans cette
procédure - upvar ?level? otherVar localVar
- permet de passer des variables par référence et
non par valeur - uplevel ?level? arg arg
- croisement entre upvar et eval évalue la
concaténations des arguments dans le contexte des
variables de level
22Portée des variables - Exemple
- set x 25
- set y 45
- proc test ox
- global y
- upvar ox lx
- set lx expr lx y
-
- puts x gt25
- test x
- puts x gt 70
23Manipulation de chaînes de caractères
- Commande string
- Commande avec sous-commandes (premier argument)
- string lenght string
- string index string index
- string range string first last
- ...
- Comparaison textuelle "string matching"
- string compare string1 string2
- retourne -1, 0 ou 1 suivant que string1 est
inférieur, égal ou supérieur à string2 du point
de vue caractères - if string compare a b 0
- puts "a et b sont identiques au niveau
chaînes de caractères" - elseif a b
- puts "a et b sont identiques au niveau
numérique"
24Manipulation de chaînes de caractères
- Comparaison "pattern matching"
- string match pattern string
- renvoie 1 si string correspond au global pattern
- set i "vélo"
- if string match v i
- puts "i correspond bien à v"
- else
- puts "i ne correspond pas à v"
-
- regexp ?switches? exp string ?matchVar?
?subMatchVar ? - compare string avec exp et extrait des portions
de string en fonction de exp - regsub ?switches? exp string subSpec varName
- remplace une partie de string
- subst ?-nobackslashes? ?-nocommands?
?-novariables? string - effectue les substitutions dans string, en
fonction des switchs
25Structures de données - Listes
chaîne de caractères
- Création
- En affectant à une variable une liste de valeurs
- set lst item1 item2 item3
- Avec la commande split
- split string ?splitchars?
- set lst split "item1-item2-item3" "-"
- Avec la commande list
- list ?arg1 arg2 ?
- set lst list "item1" "item2" "item3"
26Structures de données - Listes
- Recherche d'un élément commandes lindex,
lsearch - lindex list index
- lsearch list pattern
- lindex lst 2 gt item3
- Nombre d'éléments commande llength list
- Tri commande lsort list
- Ajouter/Supprimer commandes lappend, linsert,
concat, lreplace - lappend listName ?arg1 arg2 argN?
- linsert listName index arg1 ?arg2 argN?
- concat ?arg1 arg2 argN?
- lreplace listName first last ?arg1 arg2 argN?
- Parcours commande foreach
- foreach varName list
- pour chaque élément varName de la liste list,
exécuter
27Structures de données - Listes
- set maListe list a oui b c 3 non
- set maListeTriee lsort maListe
- set i 1
- foreach x maListeTriee
- puts "Element i x"
- incr i
a b c 3 non oui
gt
28Structures de données - Tableaux
- Variables indicées associative arrays
- Se manipulent comme des variables ordinaires
- set a(color) blue
- set var a
- set attr color
- set a(attr) blue
- puts a(color) gt blue
- set var(attr) green
- puts "la valeur de var(attr) est set
var(attr)" - gt la valeur de a(color) est
green
Regrouper les variables dans des arrays, surtout
si on souhaite quelles soient connues
globalement
29Structures de données - Tableaux
- Commande array
- array exists arrayName
- array names arrayName
- array size arrayName
- parray arrayName pattern
- array get arrayName
- array set arrayName list
- Parcours
- "foreach" sur la liste résultante de la commande
array names - foreach id array names mon_tableau
- puts "mon_tableau(id) has ID id"
-
- commandes
- array startsearch arrayName
- array nextement arrayName searchID
- array anymore arrayName searchID
- array donesearch arrayName searchID
30Evaluation de commandes - eval
- Commande eval
- eval arg1 ?arg2 ?
- Évalue une liste de chaînes de caractères et
essaie de les exécuter - Quand?
- Pour forcer une deuxième interprétation
- proc myProc a b c puts expr (ab)c
- set l list 3 4 5
- myProc l gt no value given for parameter "b" to
"myProc" - eval myProc l gt 35
- Pour créer interactivement de nouvelles commandes
- set cmd puts "Evaluating a puts"
- puts "CMD IS cmd"
- eval cmd
31Evaluation de commandes - subst
- Commande subst
- subst string
- Effectue le pas de substitution sans évaluation
de commandes, à l'exception de - Quand ?
- Pour mettre le nom d'une variable dans une autre
variable - set a "alpha"
- set b a
- puts a b
- puts "a b"
- puts " subst a b"
- puts " subst "a b""
gt a b gt alpha a gt alpha a gt alpha alpha
32Programmation modulaire
- Commande source
- source fileName
- lit un fichier script tcl et l'exécute
scripts .tcl
- Commandes exec et open
- exec ?options? arg1 ?arg2? ?argN?
- exécute un nouveau programme comme un
sous-processus - open progName ?accès?
- exécute un nouveau programme et connecte
l'entrée/sortie standard au descripteur du fichier
App.
logiciels .exe
- Commande load
- load fileName
- charge le code binaire d'une fichier et
l'incorpore dans l'interpréteur
librairies dynamiques .dll / .so
33Exemple open
- set tempFile "c/tmp/tmp.tcl"
- set outfl open tempFile w
- puts outfl
- set len gets stdin line
- if len lt 5 exit -1
- for set i len i gt 0 incr i -1
- append l2 string range line i i
-
- puts l2
- exit
-
- close outfl
set logi c/Tcl/bin/tclsh80.exe set io open
"logi tempFile" r puts io "Cette chaine
sera inversee." flush io puts "Inversee
line" gtCette chaine sera inverse gtInversee
eesrevni ares eniahc etteC
34Deuxième partie Tk
35Tk Tool Kit
- Applications graphiques interactives (GUIs)
- Programmation événementielle vs programmation
procedurale - Objets graphiques propriétés, comportement,
méthodes - Objets graphiques Tk widgets
- Construction
- Hiérarchisation
- Options communes
- Distribution dans la fenêtre
- Association événements - actions
- Quelques widgets en détail
36Applications Graphiques Interactives
- Programmation procédurale
- Dirigée par le programmeur
- Traitement séquentiel
- Interface alpha-numérique
- DOS
- Programmation événementielle
- Dirigée par l'utilisateur
- Traitement événement - action
- Interface graphique
- Windows
37Objets graphiques d'interface
- Propriétés
- Attribut, caractéristique d'apparence
- text
- couleur
- taille
- ...
- Comportement
- Réponses aux événements (binding)
- A quel événement quelle action
- mouse move gt changer pointeur de la souris
- click gt sauvegarder
- double click gt ouvrir fenêtre
- ...
- Méthodes
- Commandes prédéfinies de l'objet
- configure
- delete
- move
- ...
38Objets graphiques Tk widgets
Boutons
Menus
menu
menubutton
Edition de texte
Barres de progression
label, entry, message, text
scale
Listes
Graphiques et images
canvas
listbox
- D'autres
- toplevel, frame, scrollbar
- Chacun de ces noms de widget correspond à une
commande qui sert à le créer
39Construction d'un widget
- Création
- Widget nom arguments ?options?
- button .hello -text "Hello tous" -command puts
stdout "hello à tous" - nom du widget .hello (règles d'hiérarchisation)
- -attribut value toujours par paire
- chaque widget a des attributs spécifiques
- un ensemble d'attributs sont communs à tous les
widgets - Tk définit des valeurs par défaut pour tous les
attributs - Géométrie packer ou placer ou grid
- si le geometry manager n'a pas été invoqué, le
widget n'apparaît pas à l'écran - pack .hello
- pack .hello -side bottom -fill x -expand true
- Action le widget créé est devenu une commande
qui permet l'invocation des méthodes - .hello flash .hello invoke
- .hello configure -background blue
40Widgets - Hiérarchisation
.
.scroll
.menu
.listbox
.menu.file
.menu.help
41Widgets - Attributs communes
- Attributs de type général
- -text string
- -command tclCommand
- -textvariable variable
- -xscrollcommand .x.scroll set
- -takefocus focusType
- Géométrie
- -anchor neesennwcenter
- -justify leftcenterright
- -relief flatgrooveraisedridgesunken
- -width n -height m
- -geometry n x m
- -padx n -pady m
- -orient horizontalvertical
42Widgets - Attributs communes
- Couleurs
- -background color
- -foreground color
- -activebackground color
- -activeforeground color
- -highlightcolor color
- -selectbackground color
- -selectforeground color
- -disableforeground color
- Police, images...
- -font font
- -bitmap bitmap
- -cursor cursor
- -image image
- cette image doit avoir été créée avec la commande
- image create type ?name? ?options value ...?
43Widgets - Attributs communes
- Contrôle
- -jump truefalse (pour scrollbar)
- -setgrid truefalse (pour text ou canvas)
- -exportselection truefalse
- -state normaldisabledactive
- Rappel pour connaître les options d'un widget
donné
- .hello configure
- ou plus joliment
- proc myConfigure w
- foreach i w configure
- set option lindex i 0
- set value lindex i end
- puts "option value"
-
-
- myConfigure .hello
-anchor center -background blue -bd
borderWidth -bg background -borderwidth
2 -command puts stdout "hello à tous" -fg
foreground -font MS Sans Serif 8 ...
gt
44Géometrie distribution dans la fenêtre
- Geometry managers contrôlent les positions and
tailles des widgets - Aussi longtemps que le geometry manager n'a pas
été invoqué, le widget n'apparaît pas à l'écran - Geometry manager algorithme pour fixer la
position des widgets par rapport à la fenêtre mère
Paramètres de dessin de l'application
Taille demandée pour le widget
Géométrie de la fenêtre mère
Geometry Manager placer packer grid
Taille et position du widget
Taille de la fenêtre mère
45Le placer
- Commande place
- place widgetName option ?options?
- Déclaration précise de la position du widget
- Absolue (options -x -y)
- Relative basée sur la taille de la fenêtre
(options -relx -rely) - Chaque widget est placé indépendamment
button .x -text X place .x -x 0 -y 0
place .x -x 1.0c -rely 0.5 -anchor w
46Le packer
- Commande pack
- pack widgetName ?options?
- Déclaration des positions relatives des widgets,
selon une direction donnée - de gauche à droite (option -side left/right)
- de haut en bas (option -side top/bottom)
- Pour chaque widget
1. Déterminer le côté -side left/right/top/bottom
3. Ajuster la taille du widget afin de remplir
l'espace -fill none/x/y/both -expand true/false
2.Réserver l'espace -padx n -pady m -ipadx n
-ipady m
4. Affciher le widget
47Le packer Exemples
button .ok -text OKbutton .cancel -text
"Cancel"button .help -text Helppack .ok .cancel
.help -side left
pack .ok .cancel .help -side top
pack .ok .cancel .help -side left \-padx 2m
-pady 1m
pack .ok .cancel -side leftpack .help -side left
-expand true
pack .ok .cancel -side leftpack .help -side left
\ -expand true -fill x
48Le packer hiérarchie
- On peut utiliser des objets "frame" pour créer
des groupements plus complexes
frame .leftpack .left -side left -padx 3m -pady
3mframe .rightpack .right -side right -padx 3m
-pady 3mforeach size 8 10 12 18 24
radiobutton .ptssize -variable pts \
-value size -text "size points"pack .pts8
.pts10 .pts12 .pts18 .pts24 \ -in .left -side
top -anchor wcheckbutton .bold -text Bold \
-variable boldcheckbutton .italic -text Italic
\ -variable italiccheckbutton .underline
-text Underline \ -variable underlinepack
.bold .italic .underline \ -in .right -side
top -anchor w
49Le grid
- Commande grid
- grid widgetName ?widgetNames? option
- Arrange les widgets sur une grille
- Lignes et colonnes de dimensions variables
- Pour chaque widget, les lignes et colonnes
occupées sont spécifiées - Idéal frames avec leur propre grid
- foreach color red green lightblue black purple
white - label .lcolor -text color
- frame .fcolor -background color -width 100
-height 2 - grid .lcolor .fcolor
-
- chaque commande grid commence une nouvelle ligne
- l'ordre des widgets d'une ligne détermine leur
colonne - la taille d'une colonne est par défaut celle de
l'élément le plus large
50Binding Association événements-actions
- Commande bind associe des scripts Tcl avec des
événements générés par l'utilisateur - bind .b ltControl-hgt backspace .t
- On peut utiliser des tags pour associer plusieurs
widgets à un même événement - un seul widget .b
- une classe Text
- tous all
widget/tag
événement
script
51Bindings - Syntaxe des événements
- lt Double-Control - ButtonPress - 1 gt
Bouton ou touche
Type d'événement
- Control / Shift / Lock / Alt
- Button1 (B1) / B2 / ...
- Double / Triple
- ...
- ButtonPress/ ButtonRelease
- KeyPress / KeyRelease
- Enter / Leave
- Activate / Deactivate
- Motion
- ...
- Bouton 1-5
- Caractères ASCII
- Caractères non-alphanumériques
- Touches non-ascii (F1)
ltB1-Motiongt a ltShift_Lgt
ltKeyRelease-Shift_Lgt ltControl-Alt-Deletegt ltDouble-
ButtonPress-1gt
52Bindings - Valeurs de retour
- La commande bind peut retourner quelques valeurs
associées à l'événement () - Les coordonnées de la souris x et y.
- Le widget W.
- Le caractère qui a généré l'événement A.
- ...
- Exemples
- bind .c ltB1-Motiongt move x y
- bind .t ltKeyPressgt puts A
- bind all ltEntergt help W
53Frame et Label
- frame Pour arranger des widgets
- -background color
- -height / -width
- ...
- Rappel pour mettre 4 widgets en carré dans une
fenêtre (à l'aide du packer) il faut
nécessairement 2 frames - Label pour afficher un label dans un widget
- -text si constant
- -textvariable si variable
- set comment Un commentaire
- label .l -textvariable comment
- pack .l
- set comment "Ceci est un commentaire"
54Boutons
- button un simple bouton qui exécutera une
commande Tcl - -text
- -command
- checkbutton bouton logique lié à une variable
- -variable
- -offvalue
- -onvalue
checkbutton .chb -text Oui ou Non -variable x
-offvalue non -onvalue oui pack .chb set x
non set x oui .chb configure -command puts x
55Boutons
- radiobutton bouton parmi un ensemble pour
choisir la valeur d'une variable - -variable
- -value
foreach machine castor nestor sunline hpline
sgline radiobutton .rmachine -text
machine -variable mach -value machine pack
.rmachine set mach hpline
- menubutton bouton qui propose un menu (créé par
la commande menu) - -menu menuWidgetName
menubutton .m -text "Example de menu" -menu
.mex pack .m menu .mex (voir plus loin)
56Menu
- menu crée un menu auquel on ajoutera des
options - -postcommand tclCommand
- -tearoff truefalse
- Méthodes
- .menu add cascadecheckbuttoncommandradiobutton
separator ?option value ? - cette commande ajoute une entrée au menu les
indices commencent à 0 mais les tearoff et
séparateurs on des indices - -label string
- -menu menuWidgetName
- .menu delete index
- .menu index end
- retourne l'indice de la dernière entrée
- .menu postcascade index
- poste un sous-menu à l'indice index
- .menu entryconfigure index ?option value?
- retourne ou modifie l'entrée index
57Menu
- menubutton .mb -text Ceci est un menu déroulant
-menu .mb.menu - set m menu .mb.menu -tearoff 1
- m add command -label Time -command puts clock
format clock seconds - m add checkbutton -label Boolean -variable x
-command puts "xx" - m add separator
- m add cascade -label Machine -menu m.sub
- set msub menu m.sub -tearoff 0
- foreach machine castor nestor sunline hpline
sgline - msub add radiobutton -label machine
-variable mach -value machine -
- pack .mb
- m add command -label Quelle machine -command
puts mach
Wed Dec 08 102537 Heure d'été Paris Madrid 1999
x1
hpline
58Textes
- label
- pas d'action particulière
- message
- -aspect integer
- 100largeur / hauteur (défaut 150)
- entry
- -show any_character
- si any_character vaut on verra des étoiles au
lieu de la valeur - -textvariable varName
- Méthodes
- .entry get
- .entry delete
59Textes
- text
- -wrap nonecharword
- -state normaldisabled
- Très puissant pour faire du traitement de texte
- text .myText -wrap word -state disabled
- l'utilisateur ne peut pas écrire
- pack .myText
- Supposons qu'on veuille effacer un texte et le
remplacer par un autre - .myText configure -state normal
- .myText delete 1.0 end
- le début du texte est un la ligne 1, caractère 0
end est la fin du text - .myText insert end
- .myText configure -state disabled
- on remet le texte en lecture seule
60Scrollbar et scale
- scrollbar barres de déplacement
verticauxhorizontaux pour contrôler l'affichage
de entrylistboxtextcanvas il faut associer
les widgets entre eux
- frame .f
- pack .f
- scrollbar .f.scroll -command .f.text yview \
- -orient vertical
- text .f.text -yscrollcommand .f.scroll set
- pack .f.scroll -side right -fill y -expand true
- pack .f.text -side left -fill both -expand true
- .f.text insert end type "tree.tcl"
- toujours packer la scrollbar avant l'autre widget
- pour qu'elle reste visible
- scale échelle avec affichage de valeur
modifiable interactivement
scale .scale -variable x -resolution 5 -to
1000 pack .scale .scale set 36 .scale get
61Listbox
- listbox liste de choix avec des actions
possibles - -selectmode signlebrowsemultipleextended
- les indices peuvent prendre les valeurs
- nactiveanchorend_at_x,y
- Méthodes
- .myList insert index ?element1 ?
- insérer un (des) élément(s) à la position index
- .myList get index ?index2?
- sélectionner l'élément à index (ou de index à
index2) - .myList delete index ?index2?
- effacer l'élément à index (ou de index à
index2)
frame .frame pack .frame scrollbar .frame.scroll
-command ".frame.list yview" listbox .frame.list
-yscroll ".frame.scroll set" -setgrid 1 -height
12 pack .frame.scroll -side right -fill y pack
.frame.list -side left -expand 1 -fill
both foreach fichier glob .tcl .frame.list
insert end fichier
62Toplevel
- toplevel crée une nouvelle fenêtre au niveau du
manager - utile pour les boîtes de dialogues ou les
messages - label .labelConsole -text "Hello"
- pack .labelConsole -relief sunken -expand yes
-fill both - toplevel .new
- wm title .new "Fenêtre de contrôle"
- label .new.labelTopLevel -text "tout le monde
!!!" - pack .new.labelTopLevel -side right
63Canvas
- canvas permet de regrouper et de visualiser
plusieurs items à la fois texte, graphiques et
images - Méthodes
- .canvas create type x y ?x y ...? ?option value?
- Types d'items dans un canvas arc, bitmap,
image, line, oval, polygon, rectangle, text,
window - une option très utile est -tag tagList qui permet
de regrouper les difféerents éléments d'un canvas
et de les manipuler par groupe (tagOrId) - les autres options dépendent du type et sont bien
documentées - .canvas delete ?tagOrId
- Binding interne (pour chaque item)
- Associer des tags aux items pour les regrouper
- .monCanvas create rect 1c 1c 2c 2c tags foo
- .t tag add foo 1.0 2.0
- Associer les bindings aux tags
- .t bind foo lt1gt
- .c bind foo ltEntergt
64Canvas -Exemple
- canvas .c -width 400 -height 200
- pack .c
- .c create text 70 50 -text "Photo" -tag movable
- .c create bitmap 200 50 -bitmap _at_face.bmp -tag
movable - .c bind movable ltButton-1gt Mark x y W
- .c bind movable ltB1-Motiongt Drag x y W
- proc Mark x y w
- global state
- set state(w,obj) w find closest x y
- set state(w,x) x set state(w,y) y
-
- proc Drag x y w
- global state
- set dx expr x -state(w,x) set dy expr y
-state(w,y) - w move state(w,obj) dx dy
- set state(w,x) x set state(w,y) y
-
- .c configure -background green
65Quelques conseils
- Pour avoir des renseignements
- winfo children widgetName
- pack info widgetName
- bind widgetName ?lteventgt?
- bind class ?lteventgt?
- Pour effacer
- pack forget widgetName
- supprime un widget et tous ses descendant de la
géométrie ce qui fait qu'on peut le déplacer
ailleurs - destroy widgetName
- supprime un widget et tous ses descendants
- Frames intermédiaires pour avoir une structure
propre - Le dernier widget mis dans la géométrie est à
l'avant
66Troisième partie Tcl/Tk C/C
67Tcl/Tk C/C
- Extension du langage
- Pour quoi étendre Tcl/Tk?
- De C au Tcl SWIG
- Création du fichier "interface"
- Construction du fichier "pont"
- Génération de la librairie dynamique
- Appel à des fonctions depuis Tcl/Tk quelques
retouches - Exemple Tcl/Tk Libido
68Pour quoi étendre Tcl/Tk?
- Utiliser code compilé pour exécuter des
algorithmes qui sont trop coûteux (en temps) pour
un langage interprété - Manipuler des dispositifs ou des formats de
données qui ne sont pas actuellement supportés
par Tcl - Développer rapidement une interface graphique
pour une librairie C - Prototypage
- Validation
- Ajouter d'autres objets graphiques à Tk
- Cacher les détails d'implémentation et ne
distribuer que le code objet (compilé) - ...
69Tcl/Tk - C/C
C/C
Tcl/Tk
- Appel à des programmes exécutables
- Implementation de commandes tcl en C
Créer une librairie dynamique et l'incorporer au
shell (load)
Créer un nouveau shell avec les nouvelles
commandes
open
exec
70De C au Tcl ?
C/C
Tcl/Tk
- Initialiser les structures de données persistants
Initialisation .c
Code source .h .c
Librairie dynamique .dll / .so
- Enregistrer les nouvelles commandes dans
l'interpréteur Tcl
Enregistrement .c
Code C - Tcl library
71De C au Tcl ?SWIG
C/C
Tcl/Tk
Simplified Wrapper and Interface Generator
http//www.swig.org
Fichier "interface" .i
SWIG
parsing génération de code
Fichier "pont" .c
Librairie dynamique .dll / .so
Code source .h / .c
72Alors ...
- Programmation "propre" des fonctions C
- Création du fichier "interface" avec les
fonctions à exporter (qui deviendront commandes
Tcl) - Construction du fichier "pont" avec SWIG
- Génération de la librairie dynamique
- Appel à des fonctions depuis Tcl/Tk
73Création du fichier "interface"
- La fonctionnalité du module Tcl est définie par
les prototypes des fonctions C à exporter - Il s'agit simplement de
- donner un nom au module
- lister les fichiers d'entêtes (.h)
- définir les structures de données propres
utilisées dans les paramètres des fonctions (s'il
y en a) - lister les prototypes des fonctions à exporter
//exemple.i Un fichier interface
simple module exemple include
ltmath.hgt double puissance(double x, double y)
Nom du module d'extension
Code à copier dans le fichier pont Fichiers
d'entêtes
Prototypes C/C ANSI
74Fichier "interface"- Exemple
module axe include ltmath.hgt include
ltidima.hgt include "fnaxe.h" include
"fnplan.h" include typemaps.i typedef
unsigned short PPIMAGE_USHORT typedef struct
double x double y double z
POINTAXE typedef POINTAXE PPOINTAXE apply
int OUTPUT int nomPoints PPOINTAXE
ExtraireAxe (int xDemar, int yDemar, int zDemar,
int nomPoints) // Make parameters 'x,y,z'
output parameters apply double OUTPUT double
x, double y, double z void CoordsPointAxe
(PPOINTAXE pointaxe, double x, double y, double
z) int SoustraireImages(PPIMAGE_USHORT imA,
PPIMAGE_USHORT imB)
75Construction du fichier "pont"
- Executer SWIG avec le fichier interface
- SWIG génère automatiquement le fichier pont (.c
ou .cxx)
exemple_wrap.c
exemple_wrap.cxx
76Génération de la librairie dynamique
Visual C
- Créer un nouveau projet (Dynamic-Link Library)
- Fichiers d'entêtes (.h)
- Fichiers sources (.c / .cxx)
- Fichier pont (_wrap.c / _wrap.cxx)
- Fichiers des librairies (.lib)
- Tcl/Tk tcl80.lib
- VTK vtkdll.lib
- libido libmsvc.lib
- Settings
- C Preprocessor
- "Additional include directories" répertoires
Tcl/Tk, libido, VTK - Link Options
- "Output file name" Nom du dll
- "Build" (compile link) le projet
77Appel à des fonctions depuis Tcl/Tk
- Commande load
- libido load idotcl
- vtk load vtktcl
- autres load "./dlls/axe.dll" axe
- Casting de pointeurs
78Casting de pointeurs - Fonctions utiles
- IdCast
- Changer le type d'un objet (libido)
- Exemple
proc IdCast obj typ set t split obj "_"
return "_lindex t 1_typ"
set im IdAcrReadFile c/images/lena.acr
IMA_UCHAR
gt _f35c58_void_p set im IdCast im
PPIMAGE_UCHAR
gt _f35c58_PPIMAGE_UCHAR puts "Dimension X
IdImaDimX im" set ims IdImaSobel im NULL 1
gt
_f35a08_PPIMAGE_UCHAR
79Casting de pointeurs - Fonctions utiles
- adr2int
- Convertir un pointeur Tcl en pointeur C
- Adresse hexadécimale type -gt adresse entière
- Pour passer des pointeurs à des fonctions C
- proc adr2int adr
- scan lindex split adr "_" 1 x a
- return a
-
- Exemple Tableau d'images en entrée
- set tim ptrcreate "int" "" 2
- set tim ptrcast tim PPIMAGE_UCHAR_p
- ptrset tim adr2int im 0 "int"
- ptrset tim adr2int ims 1 "int"
- set imagette IdImaCreImagette tim 2 256 256
- affim imagette 1 imagette
80Casting de pointeurs - Fonctions utiles
- int2adr
- Convertir un pointeur C en pointeur Tcl
- Adresse entière -gt adresse hexadécimale type
- Pour récupérer un pointeur C
- proc int2adr val typ
- return format _x_typ val
-
- Exemple Tableau d'images en sortie
- set vol IdAcrReadFile c/images/sphere.acr
VOL_UCHAR - set vol IdCast vol PPPVOLUME_UCHAR
- set timv IdVolVolumeToTabImaXY vol
- puts int_get IdCast timv int_p 64
- set imv int2adr int_get IdCast timv int_p
64 - set imv IdCast imv PPIMAGE_UCHAR
- affim imv 2 imv
81Exemple d'une Application Graphique
InteractiveTcl/Tk Libido