Deprecated: Array and string offset access syntax with curly braces is deprecated in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/init.php on line 563
valid_car_entry [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


valid_car_entry

Ceci est une ancienne révision du document !



Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/parser/handler.php on line 1458

Warning: preg_match(): Compilation failed: invalid range in character class at offset 3565 in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/parser/lexer.php on line 118
A PCRE internal error occured. This might be caused by a faulty plugin

====== 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: <code python> self.saisie.bind("<Key>", self.quelletouche) </code> 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: <code python> self.saisie.configure(validate="key",validatecommand=self.veriftouche) </code> 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: <code python> def veriftouche(self): if (self.touche.char in "0123456789") or (self.touche.keysym == "BackSpace"): return True else: self.bell() return False </code> 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 ===== <code python> #!/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() </code> <html> <head> <style type="text/css"> <!-- body {background-image:url(fondcorps.jpg);} --> </style> </head> <body> </body> </html>

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

Outils de la page