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 :

A propos des controles de saisie en sortie (focusout)


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par défaut A propos des controles de saisie en sortie (focusout)
    Salut à tous,
    A propos des contrôles de saisie en sortie (focusout)

    Je souhaiterais soumettre à vos avis éclairés le bout de code ci-aprés qui joue parfaitement son rôle mais il me parait un peu loin des canons du codage.

    Le but est de factoriser le contrôle de plusieurs saisies en 'focusout'.
    Ne sont acceptées que les saisies décimales >= 0.

    L’idéal, (que je n'ai pas réussi à faire) serait de n'autoriser la sortie de l'Entry que si la saisie est conforme sans les allez-retours pour correction.

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    # -*- coding: UTF-8 -*-
    # Nom:  validation_focusout_validate_1.0.py
    #-------------------------------------------------------------------------------
    from tkinter import *
     
    def valid(ex): ## vérif de la saisie qui doit être >= 0
        try:
            if ex==1: ## verif de la saisie de Entry: E1
                val = float(varE1.get())
                if val < 0:
                    invalid(ex)
            elif ex==2:
                val = float(varE2.get())
                if val < 0: ## verif de la saisie de Entry: E2
                    invalid(ex)
        except ValueError:
            invalid(ex)
            return 0
        return 1
     
    def sortie_e(event):
        fen.event_generate('<Tab>')
     
    def invalid(ex):
        if ex==1:
            E1.focus_set() ## pour revenir sur la saisie incorecte dans E1
            E1.select_range(0,END) ## pour remplacer l'erreur
            fen.event_generate(0)  ## par un 0
            fen.event_generate('<Tab>')
        elif ex==2:
            E2.focus_set() ## pour revenir sur la saisie incorecte dans E2
            E2.select_range(0,END)
            fen.event_generate(0)
            fen.event_generate('<Tab>')
     
    fen = Tk()
    varE1 = StringVar() ; varE1.set(0)
    varE2 = StringVar() ; varE2.set(0)
     
     
    E1 = Entry(fen, textvariable = varE1, validate = 'focusout',
         validatecommand = lambda ex=1: valid(ex))
    E1.grid(column=0,row=0,padx=5)
     
    E2 = Entry(fen, textvariable = varE2, validate = 'focusout',
         validatecommand = lambda ex=2: valid(ex))
    E2.grid(column=1,row=0,padx=5)
     
    E1.focus_set()
     
    E1.bind('<Return>', sortie_e)
    E2.bind('<Return>', sortie_e)
     
    fen.mainloop()

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Salut,

    Si vous voulez écrire un code un peu plus conventionnel, pourquoi ne pas commencer par lire la documentation pour apprendre utiliser l'interface documentée?

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

  3. #3
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par défaut
    Salut wiztricks,

    Sauf votre respect, bien sûr que je l'ai lue la doc. Celle-ci et bien d'autres.
    Je ne l'ai pas bien comprise sur ce sujet et surtout, je n'ai trouvé aucun exemple qui corresponde à ce cas.

    J'aurais voulu écrire quelque chose qui ressemble à 'BeforeUpdate(ByVal)' en VBA.

    Il y quelques mois, pour un problème similaire ( et avec votre aide d'ailleurs ), la question avait été reglée par le contrôle de chaque 'car' au fur et à mesure de la saisie.
    Cette fois, je voulais, pour le plaisir, essayer une autre manière avec le trio 'validate, vcmd et invcmd' la doc en général est indigeante sur ces attributs et les exemples rarissimes sur la vadidation en sortie.

    L.P

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Citation Envoyé par luc pic Voir le message
    Il y quelques mois, pour un problème similaire ( et avec votre aide d'ailleurs ), la question avait été reglée par le contrôle de chaque 'car' au fur et à mesure de la saisie.
    C'était dans cette discussion et effectivement, c'est il y a quelques années... Et on vous avait déjà donné sinon la solution au moins des pistes.

    -edit: Et un peu plus propre, c'est quelque chose qui pourrait ressembler à çà:
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    import tkinter as tk
    import winsound
     
    beep = lambda: winsound.Beep(440, 400)
     
    class _Entry(tk.Entry):
        _vcmd = _invcmd = None
        _ignore_focusout = False
     
        @classmethod
        def register_callbacks(cls, master):
     
            root = master.nametowidget('.')
     
            def on_vcmd(p, w):
                entry = root.nametowidget(w)
                if entry._ignore_focusout:
                    entry._ignore_focusout = False
                    return True
                return entry.vcmd(p)
     
            def on_invcmd(w):
                current = root.focus_get()
                if isinstance(current, _Entry):
                    current._ignore_focusout = True
     
                entry = root.nametowidget(w)
                entry.delete(0, 'end')
                entry.focus_set()
                beep()            
     
            cls._vcmd = (root.register(on_vcmd), '%P', '%W')
            cls._invcmd = (root.register(on_invcmd), '%W')
     
     
        def __init__(self, master):
            if self._vcmd is None:
                self.register_callbacks(master)
            super().__init__(master, validate='focusout',
                             vcmd=self._vcmd, invcmd=self._invcmd)
     
        def vcmd(self, p):
            raise NotImplementedError('pure virtual method')
     
     
    if __name__ == '__main__':
        def is_float(s):
            try:
                float(s)
            except ValueError:
                return False
            else:
                return True
     
        class Entry(_Entry):
            def vcmd(self, s):
                return is_float(s)
     
        root = tk.Tk()
        entries = []
        for n in range(3):
            e = Entry(root)
            e.pack()
            entries.append(e)
        entries[0].focus_set()
        tk.mainloop()

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

  5. #5
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par défaut
    Salut à tous,
    Merci pour la réponse mais ce n'est pas mon niveau (pas encore).
    Je vais laisser décanter un peu et reprendre différemment, à la retraite on a tout son temps.
    Encore merci,
    L.P.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Citation Envoyé par luc pic Voir le message
    Je vais laisser décanter un peu et reprendre différemment, à la retraite on a tout son temps.
    Le même sans créer de classes:
    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
    import tkinter as tk
    import winsound
     
    beep = lambda: winsound.Beep(440, 400)
     
    def is_float(s):
        try:
            float(s)
        except ValueError:
            return False
        else:
            return True
     
    def _vcmd(p, w):
        entry = root.nametowidget(w)
        if entry._ignore_focusout:
            entry._ignore_focusout = False
            return True
        return is_float(p)
     
    def _ivcmd(w):
        current = root.focus_get()
        if hasattr(current, '_ignore_focusout'):
            current._ignore_focusout = True
     
        entry = root.nametowidget(w)
        entry.delete(0, 'end')
        entry.focus_set()
        beep()
     
    root = tk.Tk()
    vcmd = (root.register(_vcmd), '%P', '%W')
    ivcmd = (root.register(_ivcmd), '%W')
     
    entries = []
    for n in range(3):
        e = tk.Entry(root, validate='focusout',
                  vcmd=vcmd, invcmd=ivcmd, name='entry_%d' % n)
        e._ignore_focusout = False
        e.pack()
        entries.append(e)
    entries[0].focus_set()
    tk.mainloop()
    - 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.

Discussions similaires

  1. Controle de saisie des mot de passe
    Par yatchiya dans le forum Langage
    Réponses: 3
    Dernier message: 27/10/2011, 00h47
  2. Controler la saisie des Uitlisateurs
    Par ibrahima lamine dans le forum VB.NET
    Réponses: 1
    Dernier message: 17/02/2011, 14h54
  3. Controler la saisie dans des textbox
    Par Msysteme dans le forum ASP.NET
    Réponses: 20
    Dernier message: 25/02/2009, 14h56
  4. controle des champs de saisie
    Par etud_ini dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 05/08/2007, 15h29

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