logo

Tcl/Tk


Les packages


Pour une explication de ce que j'ai compris des différents types d'extensions, reportez-vous ici

Informations techniques

Qu'est-ce qu'un package

La notion de package existe depuis la version 8.0 de Tcl/Tk. Elle représente avec la notion de namespace un des deux piliers qui permettent de faire des applications Tcl/Tk vraiment modulaires.

Un package est un ensemble de procédures Tcl/Tk chargées dynamiquement lorsqu'une application en a besoin. Ces procédures peuvent avoir été écrites soit en Tcl/Tk , soit dans un langage évolué et dans ce cas elles sont compilées et fournies sous format binaire. Dans le deuxième cas, la portabilité intrinsèque de Tcl/Tk est perdue, et le développeur doit donc générer une version de son package pour chaque plate-forme courante.

Un exemple de chaque type :

Comment çà marche ?

Du côté du programme utilisateur

En supposant qu'un package est installé correctement (ce qu'on voit juste après), un programme peut l'utiliser en incluant la commande "package require", comme dans :

package require Img 1.1

Dans la commande ci-dessus, on dit qu'on souhaite utiliser les services du package Img, en version 1.1. Le numéro de version n'est pas obligatoire. S'il est omis, c'est le package de numéro le plus élevé qui est chargé.

Astuce : Dans TkImgMap, je masque en plus les cas d'erreur en encadrant l'appel par "catch", ce qui inhibe tous les messages d'erreur et renvoie un code indiquant si le chargement s'est bien passé ou non :

g_tstPkg = [catch {package require Img}]

Dans le cas cité, le package Img n'est pas indispensable celà et cette construction permet à TkImgMap de se configurer en fonction de sa présence ou de son absence.

Du côté du package

Un package doit se trouver à un endroit particulier pour pouvoir être connu de Tcl/Tk. Ceci est traité dans la rubrique installation.

La composition d'un package est :

Ce dernier fichier est créé par la commande pkg_mkIndex. Nul besoin de connaître son contenu. Si vous êtes curieux comme moi, vous pouvez le visualiser, c'est un simple script Tcl en fait.

Pour être pris en compte dans la fabrication du fichier pkgIndex.tcl, les scripts Tcl contiennent la directive "package provide". Par exemple, la directive :

package provide AnkiConf 1.0

indique que les fonctions qui composent le fichier forment le package AnkiConf en version 1.0. Pour les packages écrits dans un autre langage, compilés et fournis sous forme de binaire, une API en C est fournie. Je ne la connais pas.

Exemple: la création du petit package AnkiConf qui est utilisé dans TkImgMap

pkg_mkIndex . AnkiConf.tcl

On obtient le fichier pkgIndex.tcl qui est fourni avec la livraison.


Installation d'un package

Un package est fourni avec un mécanisme d'installation ou des directives précises. Les explications qui suivent ne sont là que pour les curieux, ou en cas de problème !

Voici la théorie : lorsqu'une application veut charger un package donné, c'est la variable Tcl auto_path qui est exploitée : cette variable contient une liste de répertoires dans lesquels les fichiers pkgIndex.tcl vont être analysés.
Les sous-répertoires de ces répertoires sont également parcourus.

Voici la pratique (d'après moi) : par défaut, la variable auto_path contient les répertoires où des bibliothèques Tcl, des bibliothèques Tk, et enfin du répertoire de base des scripts Tcl. C'est ce dernier qui est intéressant.

Par exemple, sous Windows, si Tcl/Tk est installé dans D:\pgm\Tcl, le répertoire des scripts est d:\pgm\Tcl\lib.

Comme aussi bien les sous-répertoires que les répertoires font partie du chemin de recherche des packages, il est pratique de regrouper les sous-répertoires des packages dans ce répertoire. Celà semble d'ailleurs être une pratique courante.

Par exemple chez moi, le répertoire d:\pgm\Tcl\lib contient les sous-répertoires : tix4.1, tk8.0, tcl8.0, Img1.1 et AnkiConf1.0.

Une autre solution, que j'utilise dans TkImgMap avec jldb.tcl, c'est de laisser ce script et le fichier d'index dans le répertoire courant, et d'ajouter le répertoire courant au chemin de recherche, par :

lappend auto_path .

ce qui littéralement veut dire : "ajoute '.' à la liste auto_path".


Get Back Retour à la page informatique Ecrire a AnkiF:

Date de dernière mise à jour : 13/11/1999