TCL\TK avec du C

Charles VIDAL vidalc@club-internet.fr

Aout 1997


  1. Introduction
  2. Rappel
  3. Exemple : taquin
  4. le widget canvas
  5. Communication entre c et tcl-tk
  6. référence:

Introduction

Je souhaite vous montrer une maniere elegante de faire un programme fonctionnant sous X, programme mi C mi Tcl-TK.

En effet, la librairie X11 est difficile, compliquée, peu documentée.Il faut avoir écrit au moins 100 lignes avant de pouvoir ouvrir une fenêtre et y dessiner quelque-chose.

De plus, bien que très puissante par ses primitives graphiques et son aspect réseau, Il est à déplorer l’inexistence de librairie IHM (Interface Homme Machine) gratuite standardisé aussi souple que MOTIF. Les Widgets Xt et Athena n’offrent que bien peu de possibilité par rapport au besoin des utilisateurs.

Le devellopeur se voit contraint de créer lui même ces propres objets graphiques. Pourtant il existe un environnement de développement qui pourrait répondre a ce besoin:

TCL-TK ( wish ).

Or pour les gens habitués au C et C++, le langage TCL parait difficile à maîtriser et n’est pas très indiqué pour des gros programmes. Il est pourtant dommage de se priver de la puissance graphique de TK qui est d’après mon experience personnelle l’une des librairies graphiques les plus puissantes parmi celles qui existent sous X. Je la trouve plus souple et plus facile que debugger pour ces raisons:

  1. TCL-TK est intrepreté.
  2. Les instructions TK sont trés simples.
  3. La connaissance de la librairie X11 n’est pas obligatoire, en effet tcl-tk tourne sur n’importe quel systeme graphique: X11, MS-Windows, Mac.
  4. Tix ( Extention de tcl-tk ) offre des éléments d’IHM exceptionnelles: FileSelectionBox à la Win95.
  5. TCL-TK est gratuit ce qui ne gate rien a l’affaire.

A l’origine TCL est un langage auquel on peut ajouter des instructions pour faire un langage proprietaire répondant a vos besoins. Mais cette ajout est peut aisé, et entraine le stockage de gros programme ( programme C + librairie TCL+TK ). Il y a pourtant un autre moyen de combiner des programmes C ou C++ avec du TK. En effet, on peut faire communiquer du C avec l’interpreteur TCL-TK(wish) grace à des tubes UNIX.

Pour cela notre programme C doit créer un programme fils et créer deux tubes entre eux deux comme l’indique le schéma ci-dessous ( mécanisme habituel sous UNIX) .

Pour arriver a une telle configuration sous UNIX, il faut que le processus n1 cree un fils ( grace a fork ), identique a lui-meme (sauf son PID).

Puis l’espace accordé au processus n2 (code , pile, tas ) est remplacé par un autre programme (ici wish).

Le numero du processus est conserve, ainsi que les tables systemes rattache au processus ( table des fichiers ...). Pour que ces deux processus communiquent, on utilise la technique des tubes (pipe). Ainsi un simple printf du processus n1 pourra etre lu sur l'entree standards du processus n2. Pour les gens qui ne sont pas habitue a la programmation sous UNIX, je leur conseille d'aller jeter un coup d'oeil sur le jean marie Rifflet et l'excellent LINUX 2.O API systeme.

De toute facon, dans la suite du document une fonction en C mettra en lumiere implementation On peut noter que les tubes peuvent s'appliquer a d'autres descripteurs que l'entree sortie standart, c'est uniquement pour des commodites de programmation que j'ai utilise cette configuration.

Rappel

Sous UNIX chaque processus possède une table de fichier pointant vers les fichier qu’il utilise.

Par traditions les 3 premiers ‚l‚ments de cette table sont les descripteurs entr‚e sortie du processus

Or on peut modifier cette table grace aux instructions dup ou dup2, procedant ainsi a une redirection(creation du tube grace a pipe). Sous UNIX chaque processus possede une table de fichier pointant vers les fichier qu'il utilise.

Voici schematiquement la configuration systeme du mecanisme du pipe entre processus n1 et processus n2:

Exemple : taquin

voici un exemple tres simple, montrant bien , je crois, les possibilites du couplage Tcl-Tk et C. Le fichier C fait au alentour de 150 lignes, ce qui pas mal pour un programme tournant sous X11.

Tout d'abord examinons la reproduction d'un processus :)

void SetUpTwoWayPipe ( const char *cmd )

Cette fonction nous amene a la configuration precedente entre notre programme et un programme cmd

SetUpTwoWayPipe("wish"); ici wish comme vous pouvez le constater

voici l'implementation :

clicker pour avoir la fonction

le widget canvas

Cet élément graphique est trés puissant:

On peut afficher :

  1. du texte
  2. des figures géométriques ( rectangle, cercle, trait etc ...)
  3. des bitamps
  4. ...
Mais cet élément a énormément de fonctionnalité en interne:

Sortie Postscript, scale ...

A chaque fois que l’on ajoute un élément ( voir les possibilité ci-dessus), celui-ci s’ajoute dans une liste interne; on associe ainsi un numéro a un élément visuel;

cette association permet par la suite d’associer une action a un élément ( grace a bind ).

L’inconvénient est que les préformances se voit ainsi diminue , En effet impossible de faire des animations de type sprite.

Communication entre c et tcl-tk

Wish peut etre considerer comme un serveur des commandes Tcl-Tk, on envoit une comande par le tube, wish les execute, et il peut vous renvoyer une chaine de caracteres, que votre programme C lira via le tube. Voici les commandes envoyes par le programme C a wish:

canvas .c -width 300 -height 300

pack .c

button .b -text quit -command exit

pack .b

....

.c create bitmap X Y -bitmap @nomdelabitmap

.c bind NUMEROBITMAP <1> "puts NUMEROBITMAP

flush stdout "

.....

(Faite tres attention a ce flush qui est fondemantale pour le bon deroulement du mecanisme.) Ce qui nous donne ceci

Wish envoit soit 255 si on appuie sur restart ou le numero du bitmap.

Au debut, on a un tableau rempli de la maniere suivante coder en C :

12
345
678
On melange le tout et des que l'on appuie sur une des bitmaps, wish envoie par le tube le numero de la bitmap (NUMEROBITMAP); le programme C le recupere et traite en fonction: Si il y a un deplacement:

.c move NUMEROBITMAP XDEPLACEMENT YDEPLACEMENT

Dans la boucle lisant les retours de wish,si on lit 255 alors on "restart", sinon on test le deplacement. Et voila le tour est joue. On peut faire de meme avec les autres langages comme pascal ( peut etre ), caml ( sur ), lisp ,ada ...

référence: