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

Tkinter Python Discussion :

Entry.trace_variable avec paramètres pour saisie numérique


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 32
    Points : 32
    Points
    32
    Par défaut Entry.trace_variable avec paramètres pour saisie numérique
    Bonjour,

    Je me lance dans Python3 et j'ai un peu de mal avec les différents concepts utilisés.
    J'ai réussi à faire un filtrage de la saisie dans un widgets Entry
    J'essaie tant bien que mal à faire pareil avec 2 Entry et là, c'est le drame.
    Ne comprenant pas tout, je n'arrive pas à faire marcher mon code
    Le premier code fonctionne très bien.
    Le second code adapté du premier, c'est la cata
    Merci pour votre aide

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    from tkinter import *
    import tkinter as Tk
     
    def OnValidate(*args):
    	cpt=0
    	chaine=s.get().replace(',','.')
    	chn_rempl=''
    	sign=False
    	for c in chaine:
    		if c in '1234657890':
    			if chn_rempl=='' and c=='0':
    				continue
    			else:
    				chn_rempl+=c
    				continue
    		elif c=='.':
    			cpt += 1
    			if cpt>1:
    				continue
    			else:
    				if chn_rempl=='':
    					chn_rempl='0'
    					e.icursor(2)
    				chn_rempl+=c
    		elif c=='-':
    			sign=not sign
    		else:
    			continue
    	if sign:
    		chn_rempl='-'+chn_rempl
    	s.set(chn_rempl)
     
    root = Tk.Tk()
    s = Tk.StringVar()
    s.trace_variable("w", OnValidate)
    e = Tk.Entry(root, textvariable=s)
    e.pack()
    root.mainloop()
    en essayant avec 2 Entry :
    il faudrait (selon moi!) passer s (StringVar) en paramètre

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    from tkinter import *
    import tkinter as Tk
     
    def valider(cc):
    	cpt=0
    	chaine=cc.get().replace(',','.')
    	chn_rempl=''
    	sign=False
    	for c in chaine:
    		if c in '1234657890':
    			if chn_rempl=='' and c=='0':
    				continue
    			else:
    				chn_rempl+=c
    				continue
    		elif c=='.':
    			cpt += 1
    			if cpt>1:
    				continue
    			else:
    				if chn_rempl=='':
    					chn_rempl='0'
    					#cp.icursor(2)
    				chn_rempl+=c
    		elif c=='-':
    			sign=not sign
    		else:
    			continue
    	if sign:
    		chn_rempl='-'+chn_rempl
    	cc.set(chn_rempl)
    root = Tk.Tk()
    s = Tk.StringVar()
    t = Tk.StringVar()
    def validers():
    	valider(s)
    def validert():
    	valider(t)
    s.trace_variable("w", validers)
    t.trace_variable("w", validert)
    e = Tk.Entry(root, textvariable=s)
    f = Tk.Entry(root, textvariable=t)
    e.pack()
    f.pack()
    root.mainloop()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 362
    Points : 36 894
    Points
    36 894
    Par défaut
    Salut,

    Ce que vous voulez dupliquer, c'est cette séquence d'instructions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    s = Tk.StringVar()
    s.trace_variable("w", OnValidate)
    e = Tk.Entry(root, textvariable=s)
    e.pack()
    Donc un copie&coller donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    s = Tk.StringVar()
    s.trace_variable("w", OnValidate)
    e = Tk.Entry(root, textvariable=s)
    e.pack()
    s = Tk.StringVar()
    s.trace_variable("w", OnValidate)
    e = Tk.Entry(root, textvariable=s)
    e.pack()
    reste à dédoublonner les variables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    s1 = Tk.StringVar()
    s1.trace_variable("w", OnValidate)
    e1 = Tk.Entry(root, textvariable=s1)
    e1.pack()
    s2 = Tk.StringVar()
    s2.trace_variable("w", OnValidate)
    e2 = Tk.Entry(root, textvariable=s2)
    e2.pack()
    Bien sûr vous pourriez écrire çà un peu mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    variables = []
    for z in range(2):
         s = Tk.StringVar()
         variables.append(s)
         s.trace_variable("w", OnValidate)
         e = Tk.Entry(root, textvariable=s)
         e.pack()
    mais pour çà il faudrait avoir la patience d'ouvrir un tuto. plutôt que recopier (mal) des lignes de code.

    - W

  3. #3
    Nouveau membre du Club
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    Merci pour cette réponse.
    C'est ce que j'ai fait "dédoublonner" en remplaçant s par t et e par f
    Le problème est que la fonction OnValidate manipule directement s
    il faudrait donc le passer en paramètre et ça, je n'arrive pas à le faire...
    J'ai essayer de passer par un appel via validers et validert qui appelle valider avec s ou t en paramètre.
    valider est l'ancien OnValidate
    lorsque je frappe une touche l'erreur qui s'affiche est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Traceback (most recent call last):
      File "expl3.py", line 45, in <module>
        root.mainloop()
      File "/usr/lib/python3.4/tkinter/__init__.py", line 1123, in mainloop
        self.tk.mainloop(n)
      File "/usr/lib/python3.4/tkinter/__init__.py", line 1540, in __call__
        self.widget._report_exception()
    AttributeError: 'StringVar' object has no attribute '_report_exception'

  4. #4
    Nouveau membre du Club
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 32
    Points : 32
    Points
    32
    Par défaut Auto solutionné !
    j'ai oublié de mettre *args en paramètre dans la définition des fonctions validers et validert
    désolé pour le dérangement

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 362
    Points : 36 894
    Points
    36 894
    Par défaut
    Citation Envoyé par FreddyONE73 Voir le message
    j'ai oublié de mettre *args en paramètre dans la définition des fonctions validers et validert
    Dommage de passer à côté du contenu de ce *args: vous y trouveriez le nom de la variable.

    Dommage aussi de ne pas ouvrir une documentation pour y trouver qu'existe un mécanisme de validation pour les Entry. Ce qu'il est normal d'attendre pour un champ de saisie (traduction d'Entry en français).

    Et regarder comment çà se met en œuvre dans des exemples.

    Comment associer un objet à une fonction? En POO, çà s'appelle une méthode. Python permet d'en avoir une version light qui s'appelle "fermeture"/"closure"

    - W

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/10/2011, 09h13
  2. PS avec paramètre pour IN
    Par maniaco_jazz dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 17/03/2008, 09h07
  3. Redirection avec paramètres pour la vue
    Par sir_gcc dans le forum Zend Framework
    Réponses: 2
    Dernier message: 16/10/2007, 21h12
  4. Réponses: 3
    Dernier message: 24/02/2005, 15h48
  5. Réponses: 3
    Dernier message: 21/05/2003, 11h44

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