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 :

validatecommand sur entry [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut validatecommand sur entry
    Bonjours, j'aimerait que mes entry ne prennent en compte que certains caractères, j'ai trouvé ça sur stackOverflow (vite fait édité par moi-même, pour comprendre je décortique petit à petit)
    mais là ... je n'y comprend rien...
    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
     
     
    from tkinter import *
     
    class window2:
    	def __init__(self):
     
     
    		self.text1 = Entry(root, validate = 'key', validatecommand = (root.register(self.validate),'%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W'))
    		self.text1.grid()
     
    	def validate(self, action, index, value_if_allowed, prior_value, text, validation_type, trigger_type, widget_name):
    		if text in '0123456789.-+':
    			try:
    				float(value_if_allowed)
    				return True
    			except ValueError:
    				return False
    		else:
    			return False
     
    root = Tk()
    a = window2()
    root.mainloop()
    Je n'ai trouvé aucune doc, root.register(self.validate) et self, action, index, value_if_allowed, prior_value, text, validation_type, trigger_type, widget_name doit être la clé de la compréhension.
    Si je comprend bien la fonction renvoie True ou False donc root.register(True) ou root.register(False) c'est ça ?

    edit : si je comprend bien les quelques docs validatecommand = (root.register(self.validate) revient juste à validatecommand = True ou validatecommand = False c'est bien ça ?

  2. #2
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Non register enregistre une commande dans tcl pour servir de callback, c'est en fait je crois par là que passe tous les callbacks qu'on utilise dans tkinter d'ailleurs, event, options command et autres.

    Ce callback que tu lui fourniras devra juste retourner des booléens en fonction de ce que tu autorises dans ton entry ou pas, et il peut recevoir plusieurs arguments en fonction de qu'on spécifie comme arguments dans validatecommand.
    Le temps ronge l'amour comme l'acide.

  3. #3
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Un exemple étant plus parlant, comme quoi ça sert de garder plein de scripts divers qu'on fait dans un coin

    Voilà ce que ça pourrait donner avec un test sur les numéros de mois.

    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
    import tkinter as tk
     
    def verificationMois(valeur) :
        if not valeur :
            return True
        elif valeur.isdigit() and 1 <= int(valeur) <= 12 :
            return True
        return False
     
    def changerEtatBoutonValidation(*args) :
        boutonValider['state'] = tk.ACTIVE if varMois.get() else tk.DISABLED
     
    def enregistrerSaisies() :
        pass
     
    root = tk.Tk()
     
    varMois = tk.StringVar()
    varMois.trace('w', changerEtatBoutonValidation)
    champMois = tk.Entry(root, textvariable=varMois, width=10, font=('', 30))
    champMois.grid()
    _cmd = champMois.register(verificationMois)
    # %P défini ce que l'Entry contiendra si on autorise ou non cette nouvelle valeur
    champMois.configure(validatecommand=(_cmd, '%P'), validate='key')
    champMois.focus_set()
     
    boutonValider = tk.Button(root, text='valider', command=enregistrerSaisies, state=tk.DISABLED)
    boutonValider.grid()
     
    root.mainloop()
    Là, il y a un combiné de var.trace qui s'occupe d'activer le bouton valider, et du callback passer dans l'entry qui permet ou non la saisie en fonction de ce qu'on autorise.

    Il y a d'autres options que le %P, voir la doc de tkinter.
    Le temps ronge l'amour comme l'acide.

  4. #4
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    J'ai produit ces quelques lignes de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    def FonctionTest(ajout):
    	if ajout in '123':
    		return True
    	else:
    		return False
     
     
    root = Tk()
    saisi = StringVar()
    entry = Entry(root, textvariable=saisi, validate='key', validatecommand=(root.register(FonctionTest), '%S' ))
    entry.grid()
     
    root.mainloop()
    qui m'on bien permis de comprendre le fonctionnement de validatecommand, si j'ai bien compris (register(fonction), a, b, c) quand il y a un événement 'key' alors validatecommand=fonction(a, b, c) ?
    par contre je ne comprend pas pourquoi quand ma FonctionTest est déclaré après j'ai NameError: name 'FonctionTest' is not defined alors que dans une classe ça marche

  5. #5
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par flapili Voir le message
    Jpar contre je ne comprend pas pourquoi quand ma FonctionTest est déclaré après j'ai NameError: name 'FonctionTest' is not defined alors que dans une classe ça marche
    Bah c'est normal, tu demandes l'enregistrement d'une fonction qui n'est pas encore définie, c'est comme si tu faisais var = maFontion que tu déclares plus bas.

    Alors que dans une classe toutes les méthodes, attributs sont déclarés à l'instance.
    Le temps ronge l'amour comme l'acide.

  6. #6
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    je pensait justement que register() créait un callback et de ce faite la vérification de si la fonction existe ou non est fait lors de l'event , "mea culpa" comme dirait l'autre ^^

  7. #7
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Bonjours, je ne comprend pas comment récupérer le nom du widget dans la fonction quand je modifie l'entry
    un exemple est plus parlant alors voici :
    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
     
    from tkinter import *
     
    def FonctionTest(widget):
     
    	print(widget)
    	return True
     
    root = Tk()
    saisi = StringVar()
    ligneDeSaisi = Entry(root, textvariable=saisi)
    ligneDeSaisi.config(validate='key', validatecommand=(root.register(FonctionTest), '%W'))
    ligneDeSaisi.grid()
     
    root.mainloop()
    j'ai .!entry , y'a t'il un moyen d'avoir ligneDeSaisi ?


    edit : autant pour moi, même sur je fait print(ligneDeSaisi) il m'affiche ça, le problème c'est que je me retrouve avec un str et non on objet, si j'utilise un dictionnaire je suis obliger d'avoir comme clé .!entry c'est ça ? .... (si plusieurs entry j'ai .!entry2 , ect )
    et si je met mon entry dans un frame j'ai .!frame.!entry peut importe le nom du frame ou de l'entry ... en faite dans ma fonctionTest j'aimerai bien pouvoir faire widget.config(background='red')dans certaine situation...

  8. #8
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Le truc, c'est que pour avoir accès à un widget par son name, il y a obligation d'avoir au moins le widget root.

    Par exemple avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    root.children[widget[1:]]
    Qui donnera l'objet.

    Maintenant si la fonction est définie là où le root n'existe pas (autre module), il serait sans doute plus simple de passer le widget dans un paramètre supplémentaire de la fonction, mais ça oblige, de créer le widget, et d'utiliser le validatecommand avec un configure ensuite

    Sinon en surchargeant Entry, je pense que c'est possible d'automatiser ça.
    Le temps ronge l'amour comme l'acide.

  9. #9
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Je n'arrive toujours pas à faire ce que je veut :'(

    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
    class LigneDeSaisi:
     
    	def __init__(self, master, X, Y, taille, Xmax=1, Ymax=1):
    		self.saisi=StringVar()
    		self.saisi.set("0")
    		self.entry=Entry(master, textvariable=self.saisi, width=taille)
    		self.entry.grid(column=X, row=Y, columnspan=Xmax, rowspan=Ymax)
     
    def TexteCadre(master, text, X, Y, taille=12, Xmax=1, Ymax=1):
    	frame=Frame(master)
    	label=Label(frame, text=text, width=taille, fg='black')
    	frame.grid(column=X, row=Y, columnspan=Xmax, rowspan=Ymax, pady=1, padx=1)
    	label.pack()
     
     
     
    class caisse:
    	def __init__(self):
    		self.root = Toplevel()
    		self.root.focus()
    		self.cadreCaisse = LabelFrame(master=self.root, text='caisse', padx=10, pady=10, background='#0099FF', labelanchor=N, font=("Times", 12, "bold"))
    		self.cadreCaisse.grid(column=0, row=0)
     
    		self.listeCaisse = ["pièce de 1c", "pièce de 2c", "pièce de 5c", "pièce de 10c", "pièce de 20c", "pièce de 50c", "pièce de 1€", "pièce de 2€", "billet de 5€", "billet de 10€", "billet de 20€", "billet de 50€", "billet de 100€", "billet de 200€", "billet de 500€", "CB", "chèque"]
    		self.dictLigneDeSaisiCaisse = {}
     
    		for i in self.listeCaisse:
     
    			TexteCadre(master=self.cadreCaisse, text=i, X=0, Y=self.listeCaisse.index(i))
    			self.dictLigneDeSaisiCaisse[i] = LigneDeSaisi(master=self.cadreCaisse, X=1, Y=self.listeCaisse.index(i), taille=6)
    			self.dictLigneDeSaisiCaisse[i].entry.config(validate='key', validatecommand=(root.register(caisse.EntryInt), i, '%S', '%P'))
     
    	def EntryInt(i, char, text):
    		if char in '1234567890':
    			try:
    				int(self.dictLigneDeSaisiCaisse[i].entry.saisi.get())
    				self.dictLigneDeSaisiCaisse[i].entry.config(background='white')
    			except:
    				self.dictLigneDeSaisiCaisse[i].entry.config(background='red')
    			return True
    		else:
    j'obtient NameError: name 'self' is not defined, le problème c'est que j'ai l'impression que register n'envoie que dans str en paramètre...
    Quand je fait (root.register(caisse.EntryInt),self, i, '%S', '%P') et def EntryInt(i, char, text): j'ai AttributeError: 'str' object has no attribute 'dictLigneDeSaisiCaisse'je suis vraiment paumé

  10. #10
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    L'erreur est juste devant ton nez pourtant

    EntryInt est une méthode de ta classe non ?

    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def EntryInt(self, i, char, text)
    Idem pour ce qu'il y'a dans ton validatecommand, root est un attribut de ta classe, donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.root.register(self.EntryInt)
    Le temps ronge l'amour comme l'acide.

  11. #11
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    y'a des jours comme ça où à force de s'acharner sur du cote on finit par ne plus savoir écrire 2 lignes ^^
    sinon dans mon programme je vais avoir 4 classes(correspondant à 4 sous programmes)y'a t'il un moyen qu'une fonction hors classe puisse agir sur le self? ( genre self.dictLigneDeSaisiCaisse[i].entry.config(background='red')Je pense déjà connaître la réponse mais on ne sait jamais ^^ sa m'éviterait de mettre 4 fois la même fonction EntryInt , EntryFloat, ect ..

  12. #12
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Le self est simplement une référence interne à une classe.

    Si tu veux modifier depuis l'extérieur, c'est sur une instance, il suffit de faire unobjet.cequetuveux

    Si tu veux faire ça depuis une fonction externe, faut lui passer en paramètres ces instances d'objets.

    Mais tu devrais quand même te pencher sur l'héritage de tes classes, ça te permettrait justement d’éviter cette redondance de code.
    Le temps ronge l'amour comme l'acide.

  13. #13
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Je me penche actuellement sur l'héritage, y'a t'il moyen de faire hériter que certaines fonctions de ma classe mère? le mieux reste de créer une classe avec juste les méthodes communes aux autres classes et de faire hériter les autres non ?

    EDIT: en créant une classe fourre_tout et en créant de nouvelles héritant de fourre_tout ça marche, mais est-ce une bonne habitude de faire ça ?

  14. #14
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par flapili Voir le message
    le mieux reste de créer une classe avec juste les méthodes communes aux autres classes et de faire hériter les autres non ?
    C'en est le principe oui, sur le papier c'est simple mais dans le code c'est plus compliqué, mais n'étant pas une pointure en modélisation objet, uml et moi, on est pas copain, j'y vais plus à l'instinct.

    Citation Envoyé par flapili Voir le message
    lEDIT: en créant une classe fourre_tout et en créant de nouvelles héritant de fourre_tout ça marche, mais est-ce une bonne habitude de faire ça ?
    Non, ce n'est pas du tout une bonne habitude, le mieux est de faire des héritages en cascade, mais bon moi j'aime pas faire 50 milles niveaux de couches, après tout dépend de qu'on développe, il doit y avoir de bons tutos là-dessus sur le site, et puis le modèle objet en python est vraiment très permissifs en comparaisons d'autres langages, pas de private, public, protected de base.
    Le temps ronge l'amour comme l'acide.

  15. #15
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    je n'est pas très bien compris l'idée des héritage en cascade, mon idée est de faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class A:
    	fonction1():
    		##fonction##
     
    	fonction2():
    		##fonction##
     
     
    class B(A):
    	######
     
    class C(A):
    	######
    pour les fonctions communes au deux classes

  16. #16
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Quand je parlais d'héritages en cascade (c'est sans doute pas le bon terme), c'est d'avoir une classe A, une classe B qui hérite de A, une classe C qui hérite de B, une classe D qui hérite de C et ainsi de suite.

    La class D héritera de tout ce qui a été défini dans A, B et C.
    Le temps ronge l'amour comme l'acide.

  17. #17
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Le truc, c'est que pour avoir accès à un widget par son name, il y a obligation d'avoir au moins le widget root.

    Par exemple avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    root.children[widget[1:]]
    Qui donnera l'objet.

    Maintenant si la fonction est définie là où le root n'existe pas (autre module), il serait sans doute plus simple de passer le widget dans un paramètre supplémentaire de la fonction, mais ça oblige, de créer le widget, et d'utiliser le validatecommand avec un configure ensuite

    Sinon en surchargeant Entry, je pense que c'est possible d'automatiser ça.
    Cette solution me semble la plus intéressante, malgré tout mes efforts je n'arrive pas en passer en paramètre le widget...

  18. #18
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Il faut utiliser une fonction anonyme, car si on passe l'objet Entry directement dans le validatecommand, tkinter doit je pense transtyper en string, d'où le fait que ça retourne encore son name, et c'est pas ce qu'on veut.

    Avec l'exemple que je t'avais montré plus haut, cela donne

    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
    import tkinter as tk
     
    # Ajout de l'argument additionnel dans la fonction
    def verificationMois(entry, valeur) :
        print(entry['bg'])
        if not valeur :
            return True
        elif valeur.isdigit() and 1 <= int(valeur) <= 12 :
            return True
        return False
     
    def changerEtatBoutonValidation(*args) :
        boutonValider['state'] = tk.ACTIVE if varMois.get() else tk.DISABLED
     
    def enregistrerSaisies() :
        pass
     
    root = tk.Tk()
     
    varMois = tk.StringVar()
    varMois.trace('w', changerEtatBoutonValidation)
    champMois = tk.Entry(root, textvariable=varMois, width=10, font=('', 30), bg='orange')
    champMois.grid()
    ####### ------------- Changement ici ---------------- ############
    _cmd = champMois.register(lambda p : verificationMois(champMois, p))
     
    # %P défini ce que l'Entry contiendra si on autorise ou non cette nouvelle valeur
    champMois.configure(validatecommand=(_cmd, '%P'), validate='key')
    champMois.focus_set()
     
    boutonValider = tk.Button(root, text='valider', command=enregistrerSaisies, state=tk.DISABLED)
    boutonValider.grid()
     
    root.mainloop()
    Le temps ronge l'amour comme l'acide.

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par flapili Voir le message
    Cette solution me semble la plus intéressante, malgré tout mes efforts je n'arrive pas en passer en paramètre le widget...
    Un bonne documentation pour la construction de la validation du widget Entry se trouve ici. Vous pourrez y trouver qu'on peut récupérer le nom du widget via le paramètre '%W'... et le widget via .nametowidget(...). Ce qui permet (éventuellement) de n'avoir qu'une seule fonction passée à register pour différentes classes dérivées d'Entry.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

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