A Hiérarchiser pour mieux contrôler ses widgets

Le meilleur moyen de connaître les widgets est de lire l'aide Tcl/Tk: pour chacun une foule d'options sont disponibles. Nous donnons juste ici leur liste avec une brève description de leurs fonctionnalités les plus usuelles.

      1 Les widgets container : la frame et la fenêtre (toplevel)

Les fenêtres de Tk sont hiérarchisées. Ainsi un widget, lors de sa création, possède des ancêtres, chacun étant séparé par un point de son père: ancêtre1.ancêtre2....widget. Ainsi certains widget peuvent en contenir d'autres, comme les fenêtres (toplevel), ou les frames (frame). Les widgets text et canvas font aussi partie de cette catégorie mais ne permettent que de placer explicitement leurs widgets fils en donnant leur position absolue. Les toplevel et les frame, quant à elles, permettent de placer leurs fils de manière relative les uns par rapport aux autres par la technique du packing.

Lorsqu'une application Tcl/Tk démarre, une toplevel est automatiquement créée, c'est la toplevel ".". Elle est l'ancêtre de tous les widgets qui seront créés par l'application, et sa destruction engendre la fin de l'application.

On peut à loisir créer d'autres fenêtres par la commande toplevel, en voici un exemple:

toplevel .top1
#Création d'une fenêtre de nom .top1
#Certaines options sont disponibles sur les toplevel, mais le mieux est d'utiliser la
# commande wm
wm maxsize .top1 1024 768
#Taille maximale de la fenêtre
wm minsize .top1 400 200
#Taille minimale de la fenêtre
wm positionfrom .top1 user
#Pour les systèmes d'exploitation qui demandent à l'utilisateur de placer manuellement la
# fenêtre. Conseil: écrire cette instruction à chaque fois
wm sizefrom .top1 user
#Pour les systèmes d'exploitation qui demandent à l'utilisateur de dimensionner manuellement
# la fenêtre
#Conseil: écrire cette instruction à chaque fois
wm title .top1 {Une fenêtre}
#Titre de la fenêtre
wm geometry .top1 500x300+10+10
# La fenêtre aura une taille de 500x300 pixels et sera positionnée en 10,10 sur l'écran
wm protocol .top1 WM_DELETE_WINDOW {puts "Je ferme le fenêtre";destroy .top1}
# Lorsque l'utilisateur ferme la fenêtre, par exemple en cliquant sur la croix en haut à droite
# sous windows95, l'application écrit Je ferme la fenêtre avant de la fermer.
# C'est une commande très utile, notamment pour demander à l'utilisateur lorsqu'il ferme la
# fenêtre principale: "Êtes-vous sûr que vous voulez vraiment quitter mon beau programme
# pour de vrai sûr de sûr ...?"

Après avoir créé une fenêtre toplevel, la première chose à faire est de créer une frame à l'intérieur de la fenêtre. Une frame est un widget le plus souvent invisible servant à hiérarchiser les widgets situés dans une fenêtre. Il peut cependant avoir une couleur, un bord, etc...

Options les plus utilisées pour les frames

-background couleur La couleur spécifiée est utilisée pour afficher la frame
-borderwidth épaisseur La frame possède une épaisseur 3D de épaisseur pixels
-relief r L'épaisseur 3D donne à la frame l'allure 3D d'épaisseur donnée par l'option -borderwidth spécifiée par r :

r = raised , r = sunken , r = flat , r = ridge , r = solid , r = groove .

Commandes les plus utilisées sur les frames

cget option Renvoie la valeur de l'option spécifiée de la frame
configure ?options? Change les options spécifiées (voir plus haut) de la frame



Voici comment nous créons la première frame de notre fenêtre:

frame .top1.f
# Création d'une frame fille de .top1
pack configure .top1.f -expand 1 -fill both
# La frame est affichée à l'intérieur de la fenêtre, l'option -expand 1 force la frame à réserver le
# plus de place possible dans la fenêtre et l'option -fill both la force à occuper toute la place
# qu'elle a réservée dans les deux sens (en x et en y)

Un widget est invisible s'il n'est pas packé (ou placé, mais cette technique est moins souple)

La commande permettant de packer un widget est de la forme :

pack configure widget ?options?

Les options les plus couramment utilisées sont données dans le tableau ci-dessous:

Option de la commande pack configure

-after autrewidget Par défaut la commande pack configure donne la priorité aux widgets dans l'ordre d'arrivée. Ainsi si deux widgets demandent à être en haut d'une frame, le premier à le demander sera au-dessus de l'autre. Cette option permet d'insérer un widget dans l'ordre d'arrivée.
-before autrewidget Similaire à l'option -after, sauf qu'il place le widget juste avant le widget autrewidget.
-expand 0_ou_1 Si -expand est mis à vrai (1), le widget consommera tout l'espace possible (partagé équitablement avec les autres widgets ayant été packés avec la même option.
-fill style Dans le cas où l'espace obtenu est plus grand que la taille demandée par le widget, celui-ci sera agrandi pour remplir l'espace horizontalement (style = x), verticalement (style = y) ou bien complètement (style = both).
-ipadx pixels Spécifie un bord de largeur pixels à rajouter à gauche et à droite à l'intérieur du widget en plus de sa taille demandée.
-ipady pixels Spécifie un bord de hauteur pixels à rajouter en haut et en bas à l'intérieur du widget en plus de sa taille demandée.
-padx pixels Spécifie un bord de largeur pixels à rajouter à gauche et à droite à l'extérieur du widget en plus de sa taille demandée.
-pady pixels Spécifie un bord de hauteur pixels à rajouter en haut et en bas à l'extérieur du widget en plus de sa taille demandée.
-side côté C'est l'option principale de cette commande, puisque la valeur de côté (top, bottom, left, right) dit ou placer le widget dans son père.

On peut masquer un widget par la commande pack forget nom_widget. Ainsi le widget n'est plus affiché jusqu'à ce qu'il soit de nouveau packé.

Maintenant créons deux éléments dans la fenêtre .top1: un bouton, en bas, et un message qui devra prendre le plus de place possible à l'intérieur de la fenêtre. On peut le faire ainsi:

button .top1.f.un_bouton -text {Ok} -command {destroy .top1}
#Création d'un bouton fils de .top1.f contenant le texte "Ok" et fermant le fenêtre .top1
pack configure .top1.f.un_bouton -side bottom
# Met le bouton en bas de la frame (donc de la fenêtre)
message .top1.f.mesg -text {Clickez sur ok pour fermer\n cette fenêtre!!!}
#Création d'un message
pack configure .top1.f.mesg -side top -expand 1 -fill both
# Affiche le message en haut de la frame en lui allouant le plus d'espace possible dans
# la fenêtre

    2 Hiérarchie de Tk

En étudiant la commande pack configure, et notamment son option -side, il est clair que les widgets peuvent être facilement packés les uns par rapport aux autres soit horizontalement (valeurs left et right pour -side), soit verticalement (valeurs top et bottom pour -side). Packer trois widgets en en mettant un en haut à gauche, l'autre en haut à droite, et le dernier en dessous des deux autres n'est pas naturel si ces trois widgets sont dans la même frame. La solution est de hiérarchiser la frame en une sous frame, qui contiendra les deux widgets du haut packés horizontalement, et le troisième widget qui sera frère de la sous frame créée, et qui sera packé verticalement par rapport à celle-ci.