Une fois les objets graphiques créés, il est possible d'interagir avec eux.
On envisage ici une interaction via des clics souris.
La méthode find_closest()
permet de détecter les objets les plus proches du clic (il existe d'autres méthodes :
find_all()
, find_enclosed()
, find_overlapping()
...).
find_closest()
renvoie un tuple de la forme (n,) où n est l'id de l'objet (son numéro dans l'ordre chronologique de création des objets).
Une fois un objet particulier ciblé, il est possible de :
itemcget()
;itemconfig()
.Les objets sont automatiquement numérotés dans l'ordre de leur création, l'id est ce numéro (cf. code fourni) mais il est possible d'affecter des étiquettes ou tags aux objets,
ce qui permet d'identifier un ensemble d'objets ayant tous le même tag ou un objet particulier ayant un tag unique.
Associer un tag à un objet lors de sa création, exemple :
nom_canvas.create_rectangle(x1, y1, x2, y2, fill='yellow', tags=('rectangle', 'jaune'))
Rechercher un objet grâce à son tag, exemple :
nom_canvas.find_withtag('rectangle')
Modifier un objet grâce à son tag, exemple :
nom_canvas.itemconfig('rectangle', fill='green')
On peut aussi ajouter des tags (addtag), supprimer des tags (dtag), lister tous les tags d'un objet (gettags, renvoie un tuple).
Il est possible de scruter un événement lié à un tag, par exemple d'appeler un fonctione (callback) lorsqu'un objet avec ce tag est cliqué :
nom_canvas.tag_bind('rectangle','<ButtonPress-1>', callback)
.
Il existe également un tag particulier permettant d'identifier l'objet cliqué.
L'instruction id = event.widget.find_withtag("current")
permet de récupérer un tuple contenant l'id de l'objet cliqué.
L'instruction nom_canvas.gettags(id[0])
permet alors de récupérer les tags associés à l'objet cliqué afin d'interagir avec lui.
Utilisation de find_closest
Utilisation des tags
La méthode find_closest()
retourne un tuple de la forme (n,) où n est un entier (int).
Avanatage : mise en oeuvre rapide et simple ; inconvénient : détecte toujours un objet même si on clique sur le fond du canvas.
Les tags permettent d'identifier avec précision des objets individuels et de manipuler des collections d'objet.
Avantage : méthode puissante permettant une gestion efficace dans des situations variées et complexes ; inconvénient : un peu plus de code, l'utilisation de
event.widget.find_withtag("current")
nécessite de tester la classe de l'objet cliqué (<class 'tkinter.Canvas'>, <class 'tkinter.ttk.Button'>...) via une instruction
de la forme isinstance(event.widget, tk.Canvas)
, isinstance(event.widget, ttk.Button)
afin de définir l'origine du clic.