IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Validation de saisie sur Tkinter.Entry


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2011
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 53
    Par défaut Validation de saisie sur Tkinter.Entry
    Bonjour à tous,
    Je suis débutant en Python et suis actuellement en train de développer une application à interface graphique en utilisant la bibliothèque Tkinter.
    Voici l'extrait de mon code qui me pose probleme. Je veux forcer l'utilisateur à rentrer un float dans l'Entry, et que la verification soit faite au moment ou le widget perd le focus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    valPrm = Entry(root,textvariable=self._value,validate='focusout',validatecommand=self.valid())
     
    def valid(self):
    		try:
    			float(self.value.get())
    		except ValueError:
    			tkMessageBox.showwarning("Valeur erronee","Veuillez entrer une valeur decimale",parent=self)
    Mon code compile bien, mais quand je rentre des valeurs texte dans mon widget, rien ne se passe et le message d'erreur n'apparait pas.
    Si quelqu'un a une idée de comment je pourrais faire pour inclure une validation de saisie sur mon widget, je suis donc preneur

    Merci d'avance et bonne soirée !

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    1,- Dans la définition de ton entry, tu as mis self._value et dans la fonction valid() self.value
    2,- Dans la définition de ton entry, tu as mis des parenthèses à self.valid, d'après moi, faut pas
    3,- float(self.value.get()) convertit bien ta valeur en float mais le résultat est perdu puisque tu n'en garde aucune référence

    Après on verra.

  3. #3
    Membre averti
    Inscrit en
    Mai 2011
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 53
    Par défaut
    Merci de ta réponse rapide !
    Alors voilà j'ai fait les changements que tu m'as indiqué, cependant j'ai toujours le même problème, le code compile bien mais aucun message n'est affiché quand je saisie par exemple du texte dans le widget.
    Voici ce que donne le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		self._valPrm = Entry(root,textvariable=self._value,validate='focusout',validatecommand=self.valid)
     
    	def valid(self):
    		try:
    			val = float(self._value.get())
    		except ValueError:
    			tkMessageBox.showwarning("Valeur erronee","Veuillez entrer une valeur decimale",parent=self)

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Rajoute des print pour voir ce qui se passe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		self._valPrm = Entry(root,textvariable=self._value,validate='focusout',validatecommand=self.valid)
     
    	def valid(self):
            print('valid')
    		try:
    			val = float(self._value.get())
                            print(val)
    		except ValueError:
    			tkMessageBox.showwarning("Valeur erronee","Veuillez entrer une valeur decimale",parent=self)
    C'est peut-être validate='focusout' qui est en cause.

  5. #5
    Membre averti
    Inscrit en
    Mai 2011
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 53
    Par défaut
    Alors voila j'ai fait quelques tests en changeant le code, et en essayant d'utiliser différentes options que 'focusout' tel que 'key', 'focusin' ou 'all'. Voici le code entier avec l'option focusout que j'ai gardé car je veux checker la saisie à la perte du focus et pas autrement.
    from Tkinter import *
    import tkMessageBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    root = Tk()
    maVar = StringVar()
    def valid():
    	try:
    		print "fct focusout"
    		val = int(maVar.get())
    		print val
    	except ValueError:
    		tkMessageBox.showwarning("Valeur erronee","Veuillez entrer une valeur decimale")
     
    entryTest = Entry(root,textvariable=maVar,validate='focusout',validatecommand=valid)
    entryTest.grid(column=0,row=0,padx=5)
     
    root.mainloop()
    Lors de la première saisie, j'entre une valeur erronnée et le message d'erreur apparait donc tout fonctionne bien. Mais dés que j'efface le contenu de l'entry et que je veux réentrer quelque chose, la fonction n'est plus appelée lors de la perte du focus. Elle n'est en faite appelée qu'une seule fois, lors de la première perte de focus après la compilation.

    La j'avoue que je sèche totalement au niveau des solutions.

    Si quelqu'un a un exemple de code avec une validation de saisie sur entry qui fonctionne correctement je suis preneur

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2012
    Messages
    292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 292
    Par défaut
    Bonjour,

    Il faut rajouter un retour de validate pour qu'il dise si sa bien terminé ou non:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def valid():
    	global val
    	try:
    		print "fct focusout"
    		val = int(maVar.get())
    		print val
    	except ValueError:
    		tkMessageBox.showwarning("Valeur erronee","Veuillez entrer une valeur decimale")
    		return 0
    	return 1
    PS HS: Si tu veux éviter d'avoir un message à chaque fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    def valid():
    	ok = StringVar()
    	Label(root, textvariable = ok).grid(column=1,row=0,padx=4)
    	try:
    		print "fct focusout"
    		val = int(maVar.get())
    		print val
    	except ValueError:
    		ok.set('NON!')
    		return 0
    	ok.set(' OK  ')
    	return 1

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/05/2008, 19h01
  2. [tkinter] Bloquer la saisi d'une Entry
    Par airod dans le forum Tkinter
    Réponses: 1
    Dernier message: 23/07/2007, 14h57
  3. Controle de saisie sur une liste déroulante
    Par antier dans le forum IHM
    Réponses: 3
    Dernier message: 07/12/2005, 05h42
  4. [JTable] Valider une saisie
    Par dam21 dans le forum Composants
    Réponses: 3
    Dernier message: 25/03/2005, 16h29
  5. [JTable] Validation de saisie
    Par kekesilo dans le forum Composants
    Réponses: 10
    Dernier message: 18/10/2004, 13h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo