Un champs de saisie Entry est utile pour permettre à l’utilisateur de modifier une ligne de texte.
Quelques définitions:
La sélection est la région du texte mise en valeur (surlignement) dans un champs de saisie, s’il y en a une.
Typiquement, la selection est réalisée par l’utilisateur avec la souris, et le texte sélectionné est copié dans le presse-papiers du système. Cependant, Tkinter vous permet de choisir si oui ou non, la sélection doit être copiée dans le presse-papiers. Vous pouvez aussi réaliser des sélections contrôlées par le programme.
Le curseur d’insertion indique où le texte sera inséré. Il est affiché lorsque l’utilisateur clique sur le champ saisie. Il apparaît normalement comme une ligne verticale qui clignote dans le composant. Vous pouvez régler finement son apparence de plusieurs façons.
Les positions à l’intérieur du texte affiché dans le champs sont précisées à l’aide d’un index. Il y a plusieurs façons d’exprimer un index:
Pour créer une nouveau champ de saisie dans une fenêtre principale ou dans un cadre parent:
Ce constructeur retourne le nouveau champ de saisie. Ses options incluent:
Paramètres: |
|
---|
Les méthodes disponibles pour les champs de saisie Entry incluent:
Supprime les caractères de la position first jusqu’à, mais sans inclure, la position last. Si le deuxième argument est omis, seul le caractère à la position first est supprimé.
Retourne le texte que contient le champ de saisie lors de son appel.
Déplace le curseur d’insertion juste avant le caractère ayant la position index.
Fait défiler le contenu du champ de saisie de telle sorte que le caractère de position index soit à la première position visible à gauche. N’a pas d’effet si le texte tient tout entier dans le champ de saisie.
Insère la chaîne de caractères s juste avant le caractère situé à la position index.
Voir la méthode scan_mark ci-dessous.
Utilisez cette méthode pour initialiser le défilement rapide du contenu d’un champ de saisie munie d’une barre de défilement horizontale.
Pour réaliser cela, lier l’événement «bouton de la souris enfoncé» à un gestionnaire d’événement qui appelera scan_mark(x), où x représente la position horizontale courante de la souris. Ensuite, lier l’événement '<Motion>' (déplacement de la souris) à un gestionnaire qui appelera scan_dragto(x), où x représente la position horizontale courante de la souris. La méthode scan_dragto fait défiler le contenu du champ de saisie de manière continue et à un rythme proportionnel à la distance (horizontale) entre la position lors de l’appel de scan_mark et la position courante.
Cette méthode sert à ajuster la sélection pour être sûr qu’elle contient le caractère situé à la position précisée par index. Si la sélection contient déjà le caractère, rien ne se produit. Autrement, la sélection est étendue à partir de sa position courante (s’il y en a une) pour inclure la position ayant l’index indiqué.
Éfface la sélection (sans supprimer son contenu). N’a pas d’effet si il n’y a aucune sélection courante.
Positionne l’index de l’ancre de sélection, 'anchor', à la position du caractère sélectionné par index et sélectionne ce caractère.
Retourne True s’il y a une sélection, False autrement.
Pour régler la sélection depuis l’application. Sélectionne le texte de la position start jusqu’à, mais sans inclure, la position end. la position start doit être avant la position end.
Pour sélectionner tout le texte du champ de saisie e, utiliser e.select_range(0,'end').
Sélection tout le texte à partir de la position 'anchor' jusqu’à, mais sans inclure, le caractère de position index.
Fait défiler le texte de telle sorte que le caractère de position index soit situé au début du champ de saisie. Cette méthode est très utile dans la liaison entre un champ de saisie et une barre de défilement. Voir Défilement du contenu d’un champ de saisie.
Positionne le texte dans le champ de saisie de telle sorte que le caractère situé à la position relative f (par rapport à l’intégralité du texte) soit positionné sur le bord gauche du champ. L’argument f doit appartenir à l’intervalle [0;1], où 0 signifie tout à gauche et 1 tout à droite.
Sert à faire défiler le contenu du champ de saisie horizontalement. L’argument quoi est soit 'units', pour indiquer un défilement caractères par caractères, 'page' pour un défilement par largeur du champ de saisie. Si l’argument nb est positif, le défilement se fait de la gauche vers la droite, s’il est négatif, le défilement se fait de la droite vers la gauche. Par exemple, pour un champ de saisie e, e.xview_scroll(-1,'pages') fera bouger le texte d’une «page» vers la droite et e.xview_scroll(4, 'units') le fait défiler de 4 caractères vers la gauche.
Pour pouvoir faire défiler le contenu d’un champ de saisie, il faudra ajouter un peu de code en plus afin d’adapter la fonction de rappel d’une barre de défilement Scrollbar aux méthodes fournies par le champ de saisie. Voici quelques fragments de code qui illustrent un tel réglage. Premièrement, la création et la liaison de la barre de défilement et du champ de saisie:
saisi = Entry(root, width=10)
saisi.grid(row=0, sticky='ew')
saisiDefil = Scrollbar(root, orient='horizontal',
command=defilGest)
saisiDefil.grid(row=1, sticky='ew')
saisi['xscrollcommand'] = saisiDefil.set
Ensuite, la définition de la fonction de rappel du code précédent:
def defilGest(L):
op, deCombien = L[0], L[1]
if op == 'scroll':
units = L[2]
saisi.xview_scroll(deCombien, units)
elif op == 'moveto':
saisi.xview_moveto(deCombien)
Dans certaines applications, vous souhaiterez vérifier le contenu d’un champ de saisie pour vous assurez qu’il est valide selon certains critères nécessaires au bon fonctionnement de votre application. Pour préciser ce qui est valide ou non, vous définirez une fonction de rappel qui vérifiera ce contenu et signalera s’il est oui ou non valide.
Voici la procédure à suivre pour mettre en oeuvre une telle validation.
Écrire une fonction de rappel qui vérifie le contenu du champ de saisie et retourne True s’il est considéré comme valide, ou False sinon. Si la fonction de rappel retourne False, les tentatives de l’utilisateur pour modifier le contenu du champ de saisie seront refusées et le texte restera inchangé.
Enregistrez cette fonction de rappel: cela consiste à produire un «emballage Tcl» autour de votre fonction Python.
Supposez que votre fonction de rappel soit estOk. Pour pouvoir associer cette fonction au champ de saisie, vous devez utilisez la méthode universelle (valable pour tout widget) register(estOk). Cette méthode crée «l’emballage Tcl» voulu et retourne une chaîne de caractères que tkinter peut utiliser pour appeler votre fonction.
Lorsque vous appelez le constructeur du champ de saisie Entry, utilisez son option validatecommand pour préciser votre fonction de validation (par l’intermédiaire de la chaîne retournée par register()), et utilisez son option validate pour préciser les circonstances de l’appel de la fonction de validation. Les valeurs de ces options sont discutées avec plus de détails ci-dessous.
Voici les valeurs admissibles pour l’option validate et leur signification.
'focus'
La validation est déclenchée à chaque fois que le champ de saisie obtient ou perd le focus (voir Le focus: réception des saisies clavier).
'focusin'
Elle est déclenchée lorsque le champ de saisie obtient le focus.
'focusout'
Elle est déclenchée lorsque le champ de saisie perd le focus.
'key'
Elle est déclenchée à chaque fois que l’appui sur une touche modifie le contenu.
'all'
Lorsque l’une quelconque des situations précédentes a lieu.
'none'
Désactive la validation. C’est la valeur par défaut de l’option. Notez que c’est la chaîne de caractère 'none', non la valeur spéciale de Python None.
La valeur de l’option validatecommand dépend des arguments que vous souhaitez voir transmis à la fonction de validation.
Peut-être que la seule chose dont à besoin votre fonction de validation est le texte qui apparaît actuellement dans le champ de saisie. Si c’est le cas, elle peut utiliser la méthode get() de la variable de contrôle qui a servi à configuer l’option textvariable du champ de saisie.
Dans ce cas, il suffit d’indiquer validatecommand=f, où f est le nom de votre fonction de validation.
Tkinter peut aussi fournir un certain nombre d’informations à votre fonction de validation. Si vous souhaitez utiliser cela, lors de l’appel du constructeur du champ de saisie, utilisez l’option validatecommand=(f, s1, s2, ...), où f est le nom «enregistré» de votre fonction de rappel (avec la méthode register(), voir plus loin pour un exemple), et chaque élément si additionnel un code de substitution. Pour chaque code de substitution fourni, la fonction de rappel reçoit un argument positionnel qui contient la valeur appropriée.
Voici les codes de substitution possibles.
'%d' | Code d’action: 0 pour une tentative de suppression, 1 pour une tentative d’insertion ou -1 si l’appel a eu lieu par gain ou perte du focus, ou par modification de la variable de contrôle textvariable. |
'%i' | Lorque l’utilisateur tente d’insérer ou de supprimer du texte, cet argument sera la position (index) du début (cas d’une sélection) de l’insertion ou suppression. Si l’appel a eu lieu par gain ou perte de focus, ou par modification de la variable de contrôle textvariable, l’argument vaut -1. |
'%P' | La valeur que le texte aurait si la modification avait lieu. |
'%s' | Le texte du champ de saisie avant le changement. |
'%S' | Si l’appel est du à une insertion ou une suppression, l’argument sera le texte à insérer ou à supprimer. |
'%v' | The current value of the widget’s validate option. |
'%V' | La raison de l’appel, parmi: 'focusin', 'focusout', 'key', ou 'forced' si la variable de contrôle textvariable a été modifiée. |
'%W' | Le nom du champ de saisie. |
Voici un petit exemple. Supposez que vous souhaitiez que votre fonction de validation reçoive le '%d' pour déterminer les circonstances de son appel; '%i' pour déterminer où l’ajout ou la suppression doit avoir lieu; et '%S' pour déterminer ce qui doit être inséré ou supprimé. Votre fonction pourrait ressembler à cela:
def estOK(pourquoi, ou, quoi):
...
Ensuite, vous utilisez la méthode universelle register() pour «emballer» cette fonction. Nous supposons que w est un widget arbitraire:
okCommand = w.register(estOK)
Pour activer cette fonction de rappel, vous aurez besoin d’utiliser ces deux options du constructeur Entry:
saisi = Entry(root, validate='all',
validatecommand=(okCommand, '%d', '%i', '%S'), ...)
Supposez que le champ de saisie contienne actuellement la chaîne 'abcdefg', et que l’utilisateur sélectionne 'cde' puis appuie sur la touche Retour Arrière. Il s’ensuivrait l’appel estOK(0,2,'cde'): 0 pour indiquer la suppression, 2 pour la position avant le 'c' et 'cde' pour la chaîne à détruire. Si estOK() retourne True, le nouveau texte est 'abfg'; sinon, le texte est inchangé.
Le widget Entry possède aussi une option invalidcommand qui sert à préciser une fonction de rappel qui est appelée à chaque fois que la fonction de validation retourne False. Cette commande peut modifier le texte du champ de saisie en utilisant la méthode set() de la variable de contrôle qui a servi à configurer l’option textvariable. Le réglage de cette option fonctionne de la même façon que celle de l’option validatecommand. Vous devez utiliser la méthode universelle register() pour envelopper votre fonction; cette méthode retourne le nom de la fonction enveloppée sous la forme d’une chaîne de caractères. Ensuite, passez cette valeur à l’option invalidcommand soit directement, soit comme le premier élément d’un tuple qui contient les codes de substitution qui vous intéressent.