IV Programmation avancée

Voilà cette liste exhaustive des widgets de base de Tk terminée. C'est bien mais, bon, ça ne dit pas comment programmer un menu déroulant, un menu contextuel, une barre d'outils, une barre d'état, et un canvas dans lequel on peut insérer des objets via un menu contextuel, etc...

C'est ce que nous allons expliquer dans ce chapitre.

    A Modularité

Comme pour tout langage, il est bon de modulariser un programme Tcl/Tk le plus possible. La méthode la plus simple pour y arriver est de découper son programme non seulement en fonctions mais aussi en fichiers, car on s'aperçoit vite que pas mal de modules s'avèrent utiles à plusieurs programmes (bibliothèques de widgets de haut niveau, ...).

La méthodologie conseillée est la suivante:

Créer un fichier source qui sera chargé de faire interpréter les différents fichiers Tcl/Tk utiles à l'application pour fonctionner. Pour cela utiliser la commande source nom_fichier.

Les séparateurs pour les noms de répertoire étant différents suivant les systèmes d'exploitation, utiliser les commandes file join, file root, etc... (voir l'aide sur file) pour manipuler les noms de fichier.

Il faut penser que les fichiers Tcl/Tk ne seront pas forcément appelés du répertoire où ils se trouvent. Il est donc nécessaire, pour trouver les fichiers utiles à l'application (fichiers source, images...) de conserver quelque part le chemin absolu du fichier principal en exécutant dès le lancement de l'application:

set CheminAbsolu [info script]
# CheminAbsolu, une variable globale contient le nom (au pire relatif, par exemple
# /mesprogs/toto.tcl sous MsWindows) du fichier principal
set CheminAbsolu [file dirname $CheminAbsolu]
# CheminAbsolu contient maintenant le chemin du fichier principal
source [file join $CheminAbsolu lib UnFichierSource.tcl]
# Interprète un fichier source Tcl/Tk situé dans le répertoire lib sous le fichier principal

Ensuite on chargera les images utilisées par l'application, par exemple pour la barre d'outils. Si celles-ci sont dans le répertoire "images" sous le fichier principal, par exemple:

image create photo ImageOuvrirFichier -file [file join $CheminAbsolu images ouvrir.gif] \
-format gif -height 32 -width 32
# L'image ImageOuvrirFichier contient maintenant l'image gif contenue dans ouvrir.gif

Il reste à créer les fonctions utilisées et notre (nos) fenêtre(s). En général, nous appellerons par raison de commodité la fonction créant la ou les fenêtres ShowWindow. Voici à quoi elle ressemblera dans le cas général:

proc ShowWindow {} {
wm positionfrom . user
wm sizefrom . user
wm title . {Titre de l'application}
wm protocol . WM_DELETE_WINDOW Quit
# Avec Quit une fonction définie dans l'application
frame .f
pack configure .f -fill both -expand 1
# Création de la frame de plus haut niveau
pack configure [ShowMenu .f left right] -side top -fill x -expand 1
pack configure [ShowStateBar .f] -side bottom -fill x -expand 1
pack configure [ShowToolBar .f left left] -side top -fill x -expand 1
pack configure [ShowCanvas .f] -side top -fill both -expand 1
# Appel des fonctions créant le menu déroulant, le canvas, la barre d'état et la barre d'outils
# Ces fonctions sont définies dans les paragraphes suivants et renvoie leur nom
# pour permettre à ShowWindow de les packer où il faut. Remarquez le passage du
# widget .f qui sera le père des widgets créés par ces fonctions.
PrepareContextualMenu
# Fonction qui créera un menu contextuel
}

Les fonctions appelées peuvent être définies dans d'autres fichiers.