~ / RICM3 / IHM / tps / 0-tcltk /
© 2007—2009 - Renaud Blanch
Le but de ce Td est de vous familiariser avec Tcl/Tk, son langage de script (référence Tcl) et sa bibliothèque graphique (référence Tk) (copie locale ou encore Tcl et Tk). Des tutoriaux concis pour Tcl et Tk sont aussi disponibles.
Les TPs ont lieu dans les salles SunRay de l'UFR IMAG. La machine sur laquelle vous êtes connecté est un serveur de session. Il faut se connecter à un serveur d'application depuis un shell pour pouvoir lancer Tcl/Tk.
$ ssh -Y login@hopper.e.ujf-grenoble.fr login@hopper.e.ujf-grenoble.fr's password: password {1}hopper tclsh % info tclversion 8.4 % info patchlevel 8.4.9 % ^C {2} hopper logout Connection to hopper.e.ujf-grenoble.fr closed. $
Si vous souhaitez travailler sur votre machine personnelle, vous pouvez télécharger une distribution de Tcl/Tk adaptée à votre système.
Dans un shell tclsh
tapez les lignes suivantes ; observez et expliquez leurs résultats :
set t coucou
puts t
puts $t
puts "$t"
puts "valeur de t : $t"
puts {$t}
puts [$t]
proc test {v} { return $v }
puts "test $t"
puts {test $t}
puts [test $t]
Les commandes tapées dans une console peuvent être saisies dans un fichier pour former un programme.
Pour les questions suivantes, sauvez dans un répertoire IHM/TP0/
les scripts contenant les solutions.
Placez dans le répertoire IHM/
le fichier utils.tcl
.
Celui-ci vous propose des fonctions utiles pour vos autres scripts (voir la documentation dans les commentaires du code).
Il vous permet d'écrire un programme tel que test.tcl
:
#!/bin/sh # restart using tclsh \ exec tclsh "$0" "$@" # load utilities source [file join [file dirname [info script]] utils.tcl] # lmax -- # # find the max in a list # # args: # list - the list # returns: # the max proc lmax {list} { return themax } # main -- if {[is_main]} { # executed only if the file is the main script proc test {} { assert "lmax {23 56}" themax } test exit }
Ce programme peut alors être utilisé tel quel :
$ tclsh test.tcl assert ([lmax {23 56}] == themax): passed $ chmod a+x test.tcl $ ./test.tcl assert ([lmax {23 56}] == themax): passedLes tests ne sont exécutés que si ce script est le script pricipal, ce qui permet de l'inclure dans d'autres scripts et d'utiliser les fonctions qu'il déclare sans exécuter les tests :
$ tclsh % source test.tcl % lmax {34 12} themaxC'est une bonne habitude à prendre que de modulariser son code dans des fichiers proposant un découpage logique des fonctionnalités. Chacun de ces fichiers, s'il est exécuté, fait passer une batterie de tests aux fonctions qu'il propose. S'il est inclus dans un autre script, ces tests unitaires ne sont pas exécutés.
Proposez une fonction qui trouve le plus grand entier d'une liste et l'affiche.
Proposez une fonction qui affiche la factorielle d'un entier.
Si vous avez donné des solutions itératives (resp. récursives) donnez une réalisation récursive (resp. itérative) de ces fonctions.
Tk se lance à l'aide de la commande wish
.
Pour améliorer les fonctionnalités de la console (historique, etc.) vous pouvez télécharger tkcon.tcl
[src] qui remplace wish
et s'utilise ainsi :
$ wish tkcon.tcl -load Tk
Utilisez la fonction tk_dialog
pour créer une boîte “À propos de…”.
La documentation en ligne ou les manpages ( man tk_dialog
) présentent son fonctionnement.
Réimplémentez les fonctionnalités de tk_dialog
grâce aux commandes élémentaires de Tk (celles qui ne commencent pas par tk_
).
Vous n'êtes pas obligés d'implémenter les fonctionnalités des arguments default
et bitmap
.
Tcl ne propose pas de modèle objet en standard. Cependant sa flexibilité permet de lui en ajouter un facilement. Nous allons utiliser l'extension gmlObject. Commencez par lire attentivement la documentation de gmlObject.
À l'aide cette extension, définissez une classe Personne
dont les instances stockent le nom de la personne et son année de naissance.
Dotez cette classe d'une méthode age
donnant son âge en années.
Dérivez-en une classe Etudiant
qui ajoute en plus un attribut contenant la filière dans laquelle il étudie.
L'architecture que nous allons utiliser pour ces TPs est une réalisation du modèle d'architecture PAC vu en cours. PAC ne préconise pas d'implémentation particulière, aussi devons nous convenir d'une manière de réaliser les agents PAC. Commencez par lire la documentation de l'implémentation de PAC que nous vous demandons d'utiliser.
Étendez l'agent PAC présenté dans le tutorial pour qu'il affiche un titre et une unité (paramétrables) pour la valeur représentée, comme illustré ci-dessous.
L'outil introspact pourra vous être utile pour mettre au point vos programmes. N'hésitez pas à vous en servir.
mise à jour : 1er octobre 2009