3 Un widget très puissant: le canvas

Le canvas est le widget offrant le plus de fonctionnalités. Il permet d'afficher des points, des lignes (pouvant être des flèches), des ovales, arcs, rectangles, polygones, images, du texte ainsi que n'importe quel autre widget (mis à part des fenêtre toplevel). Comme les éléments de texte, chaque élément créé peut être taggé, mais l'un des atouts principaux des canvas est que chaque élément, lors de sa création, se voit assigner un indice. En conservant l'indice des éléments intéressants, on pourra modifier très simplement l'allure des éléments dessinés qui deviennent ainsi des objets de canvas. Il est à noter que les coordonnées passées au canvas sont des réels.

Exemple d'utilisation de canvas:

canvas .top1.f.c
pack configure .top.f.c -side top -expand 1 -fill both
#Création d'un canvas
lappend ListeDitems [.top1.f.c create rectangle12 15 45 32 -fill red]
#Création d'un rectangle rouge dans le canvas, son coin supérieur gauche est en 12,15 et son coin inférieur droit en 45,32. La commande create renvoie l'indice du rectangle dans le canvas. On peut par exemple conserver les objets créés dans une liste... Ici ListeDitems.
.top1.f.c itemconfigure [lindex $ListeDitems [expr [llength $ListeDitems]-1]] -fill blue
# Le rectangle créé devient bleu

Options les plus utilisées pour les canvas

-height h Le canvas aura une hauteur de h pixels
-width w Le canvas aura une largeur de w pixels

Commandes les plus utilisées sur les canvas

cget option Renvoie la valeur de l'option spécifiée du canvas
configure ?options? Change les options spécifiées du canvas
coords TagOuId ?x0 y0? Si x0 et y0 ne sont pas spécifiés, renvoie les coordonnées de l'objet spécifié par son identificateur (renvoyé par canvas create lors de sa création) ou du premier objet taggé par le tag. S'ils sont spécifiés, modifie les coordonnées de l'objet spécifié
create type x y ?x y? ?options? Crée en x,y un objet du type spécifié (voir types d'objets de canvas) avec les options spécifiées. Cet objet pourra cacher les objets créés avant lui si ils partagent des points: il se trouve devant eux. On pourra changer cela en utilisant les commandes lower et raise. Renvoie l'identificateur de l'objet créé
delete TagOuId Supprime l'objet ou les objets désignés par le tag ou l'indentificateur TagOuId
itemcget TagOuId option Retourne la valeur de l'option spécifiée pour l'objet dont l'identificateur est spécifié ou bien du premier objet taggé par le tag si TagOuId est un tag
itemconfigure TagOuId ?options? Modifie la valeur des options spécifiées pour l'objet dont l'identificateur est spécifié ou bien du premier objet taggé par le tag si TagOuId est un tag
lower TagOuId ?TagsOuIds? L'objet spécifié par l'identificateur TagOuId ou bien la liste des objets taggés par TagOuId si celui-ci est un tag est placé derrière les objets spécifiés par TagsOuIds
move TagOuId dx dy Bouge l'objet (ou les objets si TagOuId est un tag) de dx,dy pixels
raise TagOuId ?TagsOuIds? L'objet spécifié par l'identificateur TagOuId ou bien la liste des objets taggés par TagOuId si celui-ci est un tag est placé devant les objets spécifiés par TagsOuIds
scale TagOuId x0 y0 xscale yscale Chaque point M=(x,y) dans le repère de centre (x0,y0) composant les objets spécifiés par TagOuId se retrouve en M'=(xscale x x, yscale x y). Dans le cas où (x0,y0)=(0,0), c'est un zoom de xscale en x, et de yscale en y.

Dans le cas des images et des widgets créés dans le canvas, scale ne modifie que les coordonnées de l'objet, pas son contenu: ainsi cette commande ne permettra pas de zoomer sur une image.

Types d'objet que l'on peut créer dans un canvas

create arc x1 y1 x2 y2 ?options? Un arc est défini d'abord par un rectangle pouvant le contenir, donné par deux de ses coins opposés: (x1,y1) et (x2,y2). La taille angulaire, par défaut 360 pour une ellipse, est donnée par les options -extent degrésdegrés donne la taille de la partie visible de l'ellipse et -start degrésdegrés donne le point de départ de l'arc. Nous aurons affaire à un fromage si on utilise l'option -fill couleur. Le trait du bord aura la couleur spécifiée par -outline couleur et l'épaisseur donnée par -width largeur. L'objet ainsi créé peut être taggé avec l'option -tag ListeDeTags.
create image x y ?options? Place une image donnée par -image NomImage aux coordonnées (x,y). Il faut utiliser l'option -anchor position pour préciser si (x,y) doit être le milieu de l'image (position = center) ou un des milieux des cotés de l'image (position = n, s, e, w pour nord, sud, est, ouest) ou bien l'un des coins de l'image (position = nw , ne, sw, se pour nord-ouest, nord-est, sud-ouest, sud-est). L'objet ainsi créé peut être taggé avec l'option -tag ListeDeTags.
create line x1 y1 ... xn yn ?options? Crée une ligne passant par les points de coordonnées (xi,yi). Son épaisseur est donnée par -width épaisseur, et sa couleur par -fill couleur. Elle peut être simple (-arrow none), posséder une flèche à la fin (-arrow last) ou au début (-arrow first) ou aux deux extrémités (-arrow both). Elle peut être dessinée en courbe de Bézier avec l'option -smooth 1 avec un arrondi prenant en compte nb points pour -splinesteps nb. L'objet ainsi créé peut être taggé avec l'option -tag ListeDeTags.
create oval x1 y1 x2 y2 ?options? Crée un ovale contenu dans le rectangle donné par les coordonnées (x1,y1) et (x2,y2) de deux de ses coins opposés. Sa couleur de remplissage est donnée par -fill couleur et la couleur de son bord est donnée par -outline couleur. L'épaisseur de son bord est donnée par -width épaisseur. L'objet ainsi créé peut être taggé avec l'option -tag ListeDeTags.
create polygon x1 y1 ... xn yn ?options? Crée un polygone dont les sommets sont les points de coordonnées (xi,yi). Sa couleur est donnée par -fill couleur, l'épaisseur de son bord est donnée par -width épaisseur, et sa couleur par -outline couleur. Il peut être dessiné en courbe de Bézier avec l'option -smooth 1 avec un arrondi prenant en compte nb points pour -splinesteps nb. L'objet ainsi créé peut être taggé avec l'option -tag ListeDeTags.
create rectangle x1 y1 x2 y2 ?options? Crée un rectangle ayant pour coins opposés (x1,y1) et (x2,y2) de couleur donnée par -fill couleur, et dont le bord a une épaisseur donnée par -width épaisseur et une couleur donnée par -outline couleur. L'objet ainsi créé peut être taggé avec l'option -tag ListeDeTags.
create text x y ?options? Crée du texte dont la position relative à (x,y) est donnée par -anchor position: pour préciser si (x,y) doit être le milieu du texte (position = center) ou un des milieux des cotés du texte (position = n, s, e, w pour nord, sud, est, ouest) ou bien l'un des coins du texte (position = nw , ne, sw, se pour nord-ouest, nord-est, sud-ouest, sud-est). La couleur des caractères est donnée par -fill couleur, leur police par -font police. Le texte peut être justifié par -justify justification et être coupé au bout de nb caractères par -width nb. Le texte affiché est donné par -text texte. L'objet ainsi créé peut être taggé avec l'option -tag ListeDeTags.
Create window x y ?options? Place un widget existant donné par -window widget dans le canvas. Sa position relative à (x,y) est donnée par -anchor position: pour préciser si (x,y) doit être le milieu du widget (position = center) ou un des milieux des cotés du widget (position = n, s, e, w pour nord, sud, est, ouest) ou bien l'un des coins du widget (position = nw , ne, sw, se pour nord-ouest, nord-est, sud-ouest, sud-est). On peut spécifier sa hauteur en pixels ainsi que sa largeur par -height pixels et -width pixels. L'objet ainsi créé peut être taggé avec l'option -tag ListeDeTags.

Il est impossible de placer une toplevel dans un canvas, et le widget placé doit être soit un fils soit le fils d'un des ancêtres du canvas.