Outils pour utilisateurs

Outils du site


valid_car_entry

Ceci est une ancienne révision du document !


Comment limiter la saisie à certains caractères dans un widget "Entry"

Objectif

Dans certains cas de saisie de données, il vaut mieux vérifier caractère par caractère que d'attendre la sortie du widget (perte de focus) ou même la fin d'une saisie complète pour découvrir qu'il y a des caractères interdits dans une valeur. Par exemple, il y la lettre “O” dans un code postal français.

Principe

On utilise des options du widget Entry (validate et validatecommand) qui, curieusement, ne sont pas dans le manuel Tkinter de Mexico (2008). Par contre, ils se trouvent ici: http://effbot.org/tkinterbook/entry.htm.

Dans l'exemple ci-dessous, on veut limiter la saisie à soit un chiffre (de 0 à 9), soit la touche backspace.

la ligne:

self.saisie.bind("<Key>", self.quelletouche)

fera que chaque touche clavier va générer un évènement qui lancera la méthode “quelletouche()”. Celle-ci ne fera qu'une seule chose: elle stockera la valeur de l'évènement.

La ligne:

self.saisie.configure(validate="key",validatecommand=self.veriftouche)

fera que seules les touches qui rendent la méthode veriftouche() vraie (=True) seront insérées dans le widget Entry. Dans le cas contraire, rien ne sera inséré.

Rien n'empêche, dans la méthode de validation, de renvoyer un message d'alerte comme un “bip” lorsque la touche qui vient d'être saisie n'est pas dans la liste acceptable:

    def veriftouche(self):
        if (self.touche.char in "0123456789") or (self.touche.keysym == "BackSpace"):
            return True
        else:
            self.bell()
            return False

Dernier point, en cas d'insertion, il vaut mieux que celle-ci respecte le protocole de validation plutôt que d'utiliser la méthode habituelle “.insert(). On le fait ici en utilisant .event_generate(car) qui envoie tout simplement le caractère comme s'il venait du clavier. Pour bien montrer que cette insertion passe par la validation, j'ai mis “toto” au milieu de la chaîne à insérer.

Code

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import Tkinter
 
class Application(Tkinter.Frame):
 
    def __init__(self, master=None):
        Tkinter.Frame.__init__(self, master, background="ivory")
 
        self.grid()
        self.saisie=Tkinter.Entry(self, background="white", width=50)
        self.saisie.configure(validate="key",validatecommand=self.veriftouche)
        self.saisie.bind("<Key>", self.quelletouche)
        self .saisie.grid(row=0, column=0, sticky="EW")
 
        self.bout=Tkinter.Button(self, text="insert", command=lambda x="123toto789": self.insevent(x))
        self.bout.grid(row=1)
 
        self.saisie.focus_set()
        self.touche=None
 
    def quelletouche(self, event):
        self.touche=event
 
    def veriftouche(self):
        return (self.touche.char in "0123456789") or (self.touche.keysym == "BackSpace")
 
    def insevent(self, ch):
        for car in ch:
            self.saisie.event_generate(car)
 
fen=Tkinter.Tk()
app=Application(fen)
fen.mainloop()

valid_car_entry.1211349565.txt.gz · Dernière modification: 2008/05/21 07:59 de tyrtamos

Outils de la page