Vous devez penser : «C'est bien beau tout ça, mais qu'est-ce qui se passe si je veux créer mes propres gestionnaires pour réagir quand l'utilisateur règle un widget d'intervalle ou un bouton fléché ? Et comment je récupère la valeur d'un ajustement dans ces gestionnaires ?» Afin de répondre à ces questions et à bien d'autres, commençons par jeter un œil aux attributs de l'objet gtk.Adjustment :
lower upper value step_increment page_increment page_size
Pour une instance donnée ajust de gtk.Adjustment, on définit ou récupère chacun de ses attributs avec ajust.lower, ajust.value, etc.
En règle générale, lorsqu'on définit la valeur d'un ajustement, on veut que le changement soit refleté par chaque widget qui utilise cet ajustement. À cet effet, PyGTK fournit la méthode suivante :
ajustement.set_value(value)
La classe gtk.Adjustment, nous l'avons vu plus haut, est une sous-classe de gtk.Object au même titre que n'importe quel widget, et peut donc émettre des signaux. Voilà pourquoi les modifications sont reflétées automatiquement lorsque vous partagez un ajustement entre une barre de défilement et un autre widget ajustable ; tous les widgets ajustables connectent des gestionnaires au signal "value_changed" de leur ajustement, ce que peut aussi faire votre programme. Voici comment définir la fonction de rappel de ce signal :
def value_changed(ajustement):
Les différents widgets qui utilisent un ajustement lui font émettre ce signal à chaque fois qu'ils modifient sa valeur. Cela arrive lorsque une action de l'utilisateur fait se déplacer le curseur dans un widget d'intervalle, mais aussi lorsque le programme change explicitement la valeur grâce à la méthode set_value(). Imaginons, par exemple, que vous ayez un gradateur et que vous vouliez changer la rotation d'une image à chaque fois que sa valeur est modifiée. Vous écririez alors une fonction de rappel semblable à celle-ci :
def rpl_rotation_img(ajust, image): rotation_image (image, ajust.value) ...
Puis il vous faudrait la connecter à l'ajustement du gradateur ainsi :
ajust.connect("value_changed", rpl_rotation_img, image)
Et si un widget reconfigure les champs upper ou lower de son ajustement ? Ça arrive par exemple quand un utilisateur ajoute du texte à une zone de texte. L'ajustement émet alors le signal "changed", qui ressemble à ça :
def changed(ajustement):
Les widgets d'intervalle connectent tous automatiquement un gestionnaire à ce signal, qui reflète le changement en modifiant leur apparence. La taille du curseur d'une barre de défilement est par exemple inversement proportionnelle à la différence entre les valeurs des arguments lower et upper de son ajustement.
Il est peu probable que vous ayez un jour besoin d'attacher un gestionnaire à ce signal, à moins que vous n'écriviez un nouveau type de widget d'intervalle. Dans tous les cas, si vous modifiez directement une des valeurs d'un ajustement, vous devriez lui faire émettre ce signal afin de reconfigurer tous les widgets qui l'utilisent. Utilisez pour cela cette méthode :
ajustement.emit("changed")
Maintenant, en avant, et ajustez !