Le magazine en français 100% LINUX

Numéro 2 - Décembre 98 / janvier 99
L'AFUL
Introduction à la programmation en GTK
LE langage SCHEME
ARKEIA
L'écriture d'interface graphique en TCL/TK
XWPE
Installer un serveur PPP
SENDMAIL
Les droits sur les fichiers
Créer des MAN PAGES
Graver des CD avec CDRECORD
E2COMP
KICKSTART
LINUX fait le café
Utiliser DIFF ET PATCH
Description d'un fichier MUTTRC
WORDPERFECT 8 pour LINUX
Net
Astuces
votez !

Votre distribution préférée

Caldera 1.82 % (228)
Debian 12.51 % (1571)
Mandrake 37.32 % (4686)
Redhat 19.35 % (2430)
Slackware 11.45 % (1438)
SuSE 17.54 % (2202)
Total votes: 12555

Pour voter entrez votre choix:

Caldera
Debian
Mandrake
Redhat
Slackware
SuSE


 

L'écriture d'interface graphique en TCL/TK

Il existe aujourd'hui de nombreuses solutions pour écrire des programmes avec interface graphique, des plus anciennes comme Athena ou Motif aux plus récentes comme GTK (Gimp Toolkit) ou QT (du monde KDE), en passant par des librairies plus exotiques comme Forms.
Je voudrais cependant démontrer dans cet article, l'extrême facilité avec laquelle on peut réaliser des programmes graphiques en Tcl/Tk.

Tcl/Tk qu'est ce que c'est ?

Tcl, un acronyme pour Tool Command Language, est souvent décrit comme un langage de scripts, similaire au shell. Mais il s'agit en fait d'un véritable langage de programmation interprété et comparable en fonctionnalités à Perl.
Bien que peu adapté aux calculs mathématiques, Tcl est très puissant pour tous les traitements de chaînes de caractères. Et bien que très simple d'utilisation, il dispose de toutes les fonctionnalités nécessaires pour créer des applications complexes.

Tcl est étroitement associé à un Toolkit Graphique dénommé Tk, ce qui lui donne une dimension bien supérieure à celle d'un simple langage de programmation. Cette librairie graphique connaît un tel succès qu'elle est également disponible pour d'autres langages comme Perl ou Python, et nous verrons plus loin comment on peut l'utiliser avec du C/C++.
Il ne faut pas oublier de mentionner, outre la facilité d'utilisation et la puissance, la troisième caractéristique majeure de Tcl/Tk : c'est un langage multi plates-formes, disponible sur quasiment tous les Unix, sur Windows 9x/NT, ainsi que sur Mac !

Un même programme peut donc tourner sans modification ni recompilation sur toutes les cibles. C'est extrêmement important quand on travaille comme moi dans un environnement hétérogène. Cela permet d'utiliser Linux comme plate-forme de développement, travail pour lequel il excelle, et de pouvoir également distribuer son travail sur Windows ou Mac .
Il ne faut pas oublier de mentionner la cerise sur le gâteau ; l'existence d'un plugin Tcl pour Netscape ou IE, donnant la possibilité à une application Tcl de s'exécuter dans le navigateur, comme une applet ( on dit Tclet ).

Un petit exemple

Comme il se doit, pour démontrer les possibilités d'un langage de programmation, nous allons commencer par un petit exemple :
Tout d'abord vérifions que Tcl/Tk est bien installé sur notre système. L'interpréteur graphique se nomme wish. Sur un système Unix, il suffit donc de taper :
type wish
pour obtenir quelque chose du style
wish is /usr/bin/wish
si vous obtenez :
wish : not found
c'est vraisemblablement que Tcl/Tk n'est pas installé  sous Linux. Cependant, cela à peu de chance de se produire, toutes les distributions connues intègrent Tcl en standard ! Sous Windows, vérifiez simplement que l'entrée Tcl figure dans le menu programmes.
Si tout est OK, créons un fichier exemple1.tcl

label .lab0 -text "Bonjour tout le mondeTcl/Tk"
button .bou0 -text "OK" -command { exit }
pack .lab0 .bou0

Puis exécutons wish exemple1.tcl. Nous voyons apparaître la fenêtre :

Voila, juste 3 lignes pour créer cette fenêtre !

Quelques explications: chaque entité graphique (widget) est nommée de manière hiérarchique : chaque parent contenant (visuellement) tous ses enfants, la séparation s'effectuant par un point, le 1er point représentant la fenêtre principale. Cela donne :
.parent0.parent1.....parentn.widget

Dans notre exemple, nous avons donc créé un label Îlab0' et un bouton Îbou0', tous deux situés dans la fenêtre principale en précisant le texte affiché avec l'option -text. Dans le cas du bouton, nous précisons l'action à effectuer avec l'option -command: dans notre exemple Îexit', mais cela pourrait être un ensemble quelconque de commandes Tcl.
Cependant, créer les widgets ne suffit pas, il faut encore indiquer comment les placer dans la fenêtre parent. Tk dispose de 3 possibilités de placement:
o le Îpack' qui les place à la suite les uns des autres  ( par défaut de haut en bas ),
o le Îplace' qui permet de les positionner suivant des coordonnées x,y absolues ou relatives,
o le Îgrid' qui arrange les widgets dans un tableau en lignes et colonnes.
Dans notre exemple, nous avons utilisé le cas le plus simple: pack sans option. Le bouton apparaît donc en dessous du label !

Les différents widgets

Nous n'allons pas dans cet article détailler le fonctionnement de chaque widget, il existe pour cela de bons livres ainsi qu'une documentation très conséquente. On peut notamment citer :
- Practical Programming in Tcl and Tk (2nd edition) par Brent B. Welch
- Tcl/Tk Reference Guide
Nous nous contenterons donc d'une liste expliquant les différentes possibilités que nous offre Tk :
o Nous avons vu le label qui permet d'afficher du texte ou des images
o Les button, permettent également d'afficher des images, utilisées pour déclencher une action
o Les checkbutton sont similaires aux button, mais restent dans un état enfoncé ou non.
o Les radiobutton, similaires aux checkbutton, mais dont un seul est enfoncé à la fois.
o Les listbox, permettant une sélection unique ou multiple.
o Les entry, pour créer des zones de saisie
o Le text, permettant d'afficher et d'éditer un texte complet, avec possibilité d'afficher différentes fontes et couleurs, et également possibilité d'hypertexte.
o Le canvas, pour dessiner lignes, cercles, ellipses, etc. On peut
également mélanger aux dessins d'autres widgets. Le canvas est très puissant et peut être utilisé pour créer ses propres widgets.
o Les frame, pour regrouper un ensemble de widgets dans des Îboîtes' aux reliefs divers.
o Les scrollbar, pouvant s'appliquer au listbox, text, entry, canvas
o Les scale, pour créer des curseurs ou des barres de progression
o Les messages, semblables aux labels, mais avec un contrôle plus fin de l'aspect multiligne
o Les menus, déroulants, cascade,  et popup.
o Les toplevel, pour créer d'autres fenêtres que la principale .
o Diverses boîtes de dialogue pour afficher un message, sélectionner un fichier, sélectionner une couleur.

Pour chaque cas, le principe est le même : on crée le widget en lui précisant les options voulues, puis on le Îplace' en utilisant un des trois pack, place ou grid.
Une fois créé, on peut récupérer les caractéristiques d'un widget par la commande :
widget_name cget options
et on peut changer ces caractéristiques comme suit :
widget_name configure options
où les options sont les mêmes que lors de la création.

En utilisant ainsi les widgets comme des briques élémentaires d'un jeu de lego, il est très facile et très rapide de créer des interfaces graphiques complètes.

Développer, Débugger

Tcl/Tk étant un langage interprété, on gagne déjà une étape par rapport au classique écrire-compiler-tester. De plus, on dispose naturellement de quelques facilités sympathiques.
Reprenons notre exemple, lancez wish sans argument, et sous l'invite de wish tapez :
source exemple1.tcl
Nous voyons apparaître la même application que précédemment,  avec tout de même une différence, on a toujours la main sous wish ! Tapez alors
.lab0 configure -background red
 

Vous voyez que dynamiquement, on peut changer la configuration des widgets,  l'application continuant de tourner. On peut de la même manière consulter et modifier les variables,  voire ajouter ou enlever des widgets.
Il faut signaler que sous emacs, on dispose d'un mode Tcl qui permet de lancer l'application et d'avoir accès à l'invite de wish, sans quitter emacs.
Cependant, malgré ces diverses fonctionnalités qui aident grandement au debug, Tcl/Tk ne propose pas en standard de fonctions avancées de debug. Qu'à cela ne tienne, nous avons Tuba!.
Tuba est une application, elle même écrite en Tcl, qui permet de poser des points d'arrêt, faire du pas à pas, consulter et modifier les variables, et tout ceci de manière graphique.
Tuba est disponible à l'adresse suivante :
http://www.doitnow.com/~iliad/Tcl/tuba/

Bien qu'il soit très facile d'écrire une interface graphique avec Tk, il faut quand même l'écrire, et il est bien pratique d'avoir un builder d'interface pour créer et positionner visuellement les widgets. Si un tel builder n'existe pas en standard dans Tcl/Tk,  il y a néanmoins une autre solution: vtcl.

Vtcl est un builder d'application, également écrit en Tcl, permettant en quelques clics de créer son interface, de positionner les widgets, d'éditer leurs caractéristiques, couleurs, reliefs, comportements, etc.... Vtcl permet même d'éditer le code de chaque fonction associée aux widgets.
Vtcl est disponible à l'adresse suivante :
http://www.neuron.com/stewart/vtcl/
Il est important de remarquer que ces logiciels, écrits en Tcl, tournent sur toutes les plates-formes. On aura donc un environnement de développement identique quel que soit la plate-forme choisie !

Les Extensions

Tk fournit tous les widgets de base et permet de les combiner. Mais il peut être intéressant de disposer de quelques objets plus évolués. Il existe pour ce faire de nombreuses extensions Tcl/Tk. On peut citer, parmi les plus connues,  Tix, Incr Tcl, Blt, mais il y en a bien d'autres. Cependant, toutes ces extensions ont l'inconvénient de nécessiter une installation plus ou moins lourde, et pas forcément disponible sur toutes les plates-formes .

Nous parlerons donc plus en détails d'extensions réalisées en pur Tcl, faciles à intégrer à vos applications :
o Les bulles d'aide : leur utilité dans une interface graphique n'est plus à démontrer. Voici un petit source Tcl de 2.3Ko,  d'ailleurs tiré de vtcl, à ajouter à une application pour obtenir les fameuses bulles.

o Un arbre: semblable à ce que l'on peut voir dans Windows Explorer, environ 10Ko de code à intégrer pour pouvoir afficher ça.
On peut trouver le widget arbre à l'adresse suivante :
http://tobit.hwaci.com/sw/tk/treepi.html

o Une combobox: c'est à dire une zone de saisie associée à un menu déroulant

On peut trouver la combobox à l'adresse suivante :
http://www1.clearlight.com/~oakley/tcl/combobox/index.html

o Un notebook : plusieurs onglets permettant d'afficher différentes pages alternativement . Il vous faudra rajouter 8Ko de code pour obtenir :

On peut trouver le widget notebook à l'adresse suivante :
http://tobit.hwaci.com/sw/tk/nbpi.html

o Un sélecteur de répertoire: au look identique au sélecteur de fichier intégré à Tcl/Tk. Une procédure de seulement 9Ko :
On peut trouver le sélecteur à l'adresse suivante :
http://www.mygale.org/05/droche/tkgetdir/
Voilà un aperçu de quelques extensions bien utiles,  mais on peut évidemment en trouver bien d'autres. Pour cela, je vous conseille de visiter les sites :
http:// www.scriptics.com
http://sunscript.sun.com/
dédiés à Tcl, sur lesquels vous pourrez télécharger les dernières versions de Tcl/Tk ainsi que de nombreuses extensions.

Tcl/Tk et le C/C++

Les langages interprétés possèdent de nombreux avantages ; malheureusement, ils ont également quelques inconvénients . En premier lieu,  les sources sont forcement livrées avec l'application, ce qui peut poser problème. Ensuite, cela peut introduire certaines lenteurs. De plus, Tcl/Tk ne permet pas de créer des structures de données très complexes comme on peut le faire en C ou C++.

Pas de panique,  il y a aussi une solution à tout cela :
Embedded Tk, plus couramment appelé ET, est un outil permettant de créer des exécutables autonomes à partir d'une mixture de C ou C++ et de Tcl/Tk. Avec ET, il est possible d'appeler un script Tcl/Tk dans une routine C,  ou d'appeler une routine C dans un script Tcl/Tk.

ET est vraiment très simple à utiliser. Il permet d'utiliser à la fois les facilités de Tcl/Tk pour les interfaces graphiques et les traitements des chaînes de caractères, et la puissance du C là où elle est nécessaire.
On peut trouver ET à l'adresse suivante :
http://www.hwaci.com/sw/et

La communauté des programmeurs Tcl est très active et de plus en plus de nouveaux logiciels apparaissent régulièrement. Alors, à vos claviers ...

Daniel Roche
Ingénieur système Unix/Linux et Réseau pour la société Lectra Systèmes
mail : [email protected]
http://www.mygale.org/05/droche
 

 


Linux Magazine n°20

est sorti en kiosque

Ecrivez-nous !

Vous avez des questions,
des commentaires
ou des critiques à
faire sur le magazine ?
Ecrivez-nous !

Tous les articles en ligne sont sous licence FDL (Free Documentation Licence)
pour en savoir plus

Liens

Linux Stock Index
LWN Linux Stock Index
83.0 +4.8
Fri Sep 1 19:12:58 2000 UTC

Linux Today

CNET News.com: Judge orders Microsoft to pay Bristol $1 million
Linux.com: An Interview with Guido van Rossum
LinuxPorts.com: PHP -- A Cookie Experiment
CNET News.com: AOL rivals make progress on instant chat spec
Apache Today: Persistent Perl on the Virtual Host
The Register: Microsoft won't fix new Windows security flaw
Apache Today: Netcraft's August 2000 Figures: Apache Again!
The Software View: High iQLinux.com
Apache Today: The Perl You Need to Know, Part II: Working with Warning Messages
eWeek: Novell plans massive layoffs

© Copyright 2000 Diamond Editions/Linux magazine France - Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; A copy of the license is included in the section entitled "GNU Free Documentation License".