Tk::bindtags - Déterminer les liaisons appliquées à une fenêtre, ainsi que leur ordre d'évaluation
$widget->bindtags([tagList]);
@tags = $widget->bindtags;
Lorsqu'on crée une liaison avec la commande bind, elle est associée soit à une fenêtre particulière telle que $widget, un nom de classe tel que Tk::Button, le mot-clé all, ou n'importe quelle autre chaîne. Toutes ces formes sont appelées des tags de liaison (binding tags). Chaque fenêtre a une liste de tags de liaison qui détermine comment seront traités les événements pour cette fenêtre. Lorsqu'un événement se produit dans une fenêtre, il est appliqué à chaque tag de la fenêtre dans l'ordre : pour chaque tag, la liaison la plus spécifique correspondant au tag et à l'événement donnés est exécuté. Voir la documentation de Tk::bind pour des informations supplémentaires sur le processus de correspondance.
Par défaut, chaque fenêtre possède quatre tags de liaison qui sont le nom de classe de la fenêtre, le nom de la fenêtre, le nom de la plus proche fenêtre toplevel ancêtre et all, dans cet ordre. Les fenêtres toplevel ont seulement trois tags par défaut, puisque le nom du toplevel est le même que celui de la fenêtre.
Notez que cet ordre est différent de l'ordre utilisé par Tcl/Tk. Dans l'ordre des liaisons de Tcl/Tk, la fenêtre précède le nom de classe. Ceci parce que Tcl est procédural et non orienté objet et la manière normale d'écraser les liaisons de classe dans les applications Tcl/Tk est d'utiliser une liaison d'instance. Toutefois, dans perl/Tk la manière normale est de dériver une classe. L'ordre perl/Tk oblige les liaisons d'instance à s'exécuter après les liaisons de classe, et ainsi les callbacks de liaison d'instance peuvent utiliser les changements d'état (par exemple un changement de sélection) qu'une liaison de classe aurait pu réaliser.
La commande bindtags permet de lire et de modifier les tags de liaison d'une fenêtre.
Si on invoque $widget->bindtags sans arguments, l'ensemble actuel de tags de liaison de $widget est renvoyé sous forme de liste. Si l'argument tagList est spécifié pour bindtags, il doit être une référence à un tableau ; les tags de $widget sont remplacés par les éléments du tableau. (on peut créer une référence un tableau anonyme en mettant les éléments entre crochets [ ]). Les éléments de tagList peuvent être arbitrairement des chaînes ou des objets widgets, et s'il n'existe pas de fenêtre pour un objet au moment du traitement d'un événement, le tag est ignoré pour cet événement. L'ordre des éléments dans tagList détermine l'ordre dans lequel les callbacks de liaison sont exécutés en réponse aux événements. Par exemple, la commande :
$b->bindtags([$b,ref($b),$b->toplevel,'all'])
applique l'ordre de liaison Tcl/Tk pour lequel les callbacks de liaison seront évaluées pour (par exemple) un bouton $b et donc les liaisons d'instance de $b seront invoquées en premier, suivies par les liaisons de classe de $b, suivies par les liaisons pour le toplevel de $b, suivies par les liaisons 'all'.
Si tagList est une liste vide c'est à dire [], les tags de liaison pour $widget sont renvoyés à l'état par défaut de perl/Tk décrit plus haut.
La commande bindtags peut être utilisée pour introduire des tags de liaison additionnels arbitraires pour une fenêtre, ou pour supprimer les tags standard. Par exemple, la commande :
$b->bindtags(['TrickyButton',$b->toplevel,'all'])
remplace (par exemple) pour $b le tag Tk::Button par TrickyButton. Cela signifie que les liaisons de widget par défaut des boutons, qui sont associés au tag Tk::Button, ne s'appliqueront plus à $b, mais que n'importe quelle liaison associée à TrickyButton s'appliquera (peut être un nouveau comportement de bouton)
La forme actuelle de cette méthode, due au comportement 'natif' de Tk, qui consiste à renvoyer une liste mais à accepter seulement une référence de tableau, est presque intuitive. L'interface perl/Tk pourrait être améliorée, mais le renvoi d'une liste étant sensible, on pourrait, de préférence, permettre de passer une liste pour mettre en place les liaisons.
Tk::bind Tk::callbacks
binding, event, tag
Jean-Pierre Vidal jeanpierre.vidal@free.fr
Aucune relecture pour le moment.