~ / RICM3 / IHM / tps / 0-tcltk /

TP 0 - Introduction à Tcl/Tk

© 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.

Utilisation des machines

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.

Tcl

Dans un shell tclsh tapez les lignes suivantes ; observez et expliquez leurs résultats :

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): passed
Les 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}
themax
C'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

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 manpagesman 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.

Programmation orientée objet

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.

Programmation d'agents PAC

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