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 de (*args) et de vars()[x]


Sujet :

Tkinter Python

  1. #1
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    102
    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 : 102
    Points : 71
    Points
    71
    Par défaut A propos de (*args) et de vars()[x]
    Bonjour à tous,

    Dans le code ci-après, je cherche à comprendre à quoi correspond la 2° valeur qui est renvoyée par 'args' : ici c'est '' et à quoi elle sert.

    'PY_VAR0' est le nom de textvariable et 'w' est le mode mais '' ?

    Serait-il possible d'utiliser cette deuxième valeur pour 'remonter' le nom en clair du 'textvariable' ( s0, s1, etc. ) dans l'exemple.


    Sinon comment obtenir le nom de textvariable dans la fonction 'OnValidate(*args)' pour factoriser dans le cas de saises similaires multiples ?


    Apparemment, la fonction 'vars()[x]' qui fonctionne bien dans la boucle principale pour construire les 'Entry' et 'textvariable' est inopérante dans la fonction 'OnValidate(*args)'.

    Je souhaitais reconstruire ainsi le nom de la StringVar() mais ça marche pas.

    L.P.


    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
    from tkinter import*
     
    def affiche(event):
        w=event.widget
        etq.config(text=w.get())
     
    def OnValidate(*args):
    #    print(args) # donne-> ('PY_VAR0', '', 'w')
    ##    q=int(args[0][6:8]) ; print(q)
    ##    tv='s%d' % q ; print(tv)
    ##    print(vars()[tv]) ## non reconnu comme variable
        for c in s0.get():
            if not c.isdigit():
                root.event_generate('<BackSpace>')
     
    root = Tk()
    entries = []
     
    for z in range(-1,6):
        t='s%d' % (z+1) # ;print(t) ; vars()[t]=''
        vars()[t]=StringVar() # ; print(vars()[t])
        vars()[t].trace_variable("w", OnValidate)
        p='e%d' % (z+1)  ; print(p)
        vars()[p] = Entry(root, textvariable =vars()[t])
        vars()[p].pack()
        vars()[p].bind('<Return>', affiche)
        print(vars()[p])
        entries.append(vars()[p],)
     
    etq=Label(text='')
    etq.pack()
    entries[0].focus_set()
     
    root.mainloop()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Salut,

    'PY_VAR0' est le nom de textvariable et 'w' est le mode mais '' ?
    Cela correspond a ce que TCL définit comme upvar qui peut être un scalaire ou un tableau.
    Si c'est un tableau, ce sera l'index, sinon ce sera la chaine vide.
    Côté tkinter, un StringVar (et autre machinVar) sera toujours associé à un scalaire.

    Pour le reste, je ne comprends pas ce que vous essayez de faire.
    Pourquoi ne pas écrire:
    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
    from tkinter import*
     
    def affiche(event):
        w=event.widget
        etq.config(text=w.get())
     
    def OnValidate(name, index, mode):
        var = myvars.get(name)
        print(name, var.get())
        for c in var.get():
            if not c.isdigit():
                root.event_generate('<BackSpace>')
     
    root = Tk()
    entries = []
     
    myvars = {}
     
    for z in range(-1,6):
        name = 'myvars-%d' % (z+1)
        v = myvars[name] = StringVar(name=name)
        v.trace_variable("w", OnValidate)
     
        entry = Entry(root, textvariable =v)
        entry.pack()
        entry.bind('<Return>', affiche)
        print(entry)
        entries.append(entry)
     
    etq=Label(text='')
    etq.pack()
    entries[0].focus_set()
     
    root.mainloop()
    En écrivant vars() (ou locals()) hors d'une fonction, c'est comme utiliser globals().
    Autant utiliser globals() directement ou mieux un dict ad hoc comme myvars.

    Plutôt que de passer par des objets globaux, vous pouvez aussi utiliser des noms locaux via des "closures":
    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
    from tkinter import*
     
    def affiche(event):
        w=event.widget
        etq.config(text=w.get())
     
     
    def OnValidate(var):
        def inner(*args):
            print(args[0], var.get())
            for c in var.get():
                if not c.isdigit():
                    root.event_generate('<BackSpace>')
        return inner
     
    root = Tk()
    entries = []
     
    for z in range(-1,6):
        v = StringVar()
        v.trace_variable("w", OnValidate(v))
     
        entry = Entry(root, textvariable =v)
        entry.pack()
        entry.bind('<Return>', affiche)
        print(entry)
        entries.append(entry)
     
    etq=Label(text='')
    etq.pack()
    entries[0].focus_set()
     
    root.mainloop()
    C'est juste une autre façon de procéder qui utilise les fonctions comme objets.

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

  3. #3
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    102
    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 : 102
    Points : 71
    Points
    71
    Par défaut
    Bonjour à tous et à 'wiztricks' particulièrement,

    Pourquoi pas en effet !!

    J'ai bien essayé la solution 'dico' mais je n'ai réussi à y faire rentrer que des 'string'.
    C'est pour ça que j'ai cherché à les convertir en nom de variable avec la fonction 'vars()[]' mais sans succès.

    Le premier des 2 exemples est exactement celui que j'aurais souhaité écrire si j'avais su le faire.
    Mais je n'en suis pas là..

    Je vais aller faire une bonne heure de vélo pour me changer les idées et au retour je verrai si je comprends mieux:

    << v = myvars[name] = StringVar(name=name) >>

    parce-que pour l'instant c'est loin d'être clair. Surtout le (name=name). C'est vraiment nouveau pour moi et je suis sûr que ça interpellera plus d'un visiteur-lecteur..

    Je garde le 2éme exemple pour dans quelques jours, le temps de digérer le premier.

    Encore merci.

    L.P.

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

Discussions similaires

  1. Overloading avec var args
    Par Roy Miro dans le forum Langage
    Réponses: 6
    Dernier message: 19/07/2010, 22h59
  2. PARSE ARG et PARSE VAR
    Par sam01 dans le forum z/OS
    Réponses: 3
    Dernier message: 17/12/2008, 16h02
  3. A propos des modèles d'objet (avec sources)
    Par DevX dans le forum C++Builder
    Réponses: 14
    Dernier message: 01/12/2002, 12h22
  4. Fonctionnement de la compression DivX
    Par Rodrigue dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 20/09/2002, 14h10
  5. A propos du composant DBGrid
    Par _Rico_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/07/2002, 09h18

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