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 :

Nommer dynamiquement des widgets ENTRY


Sujet :

Tkinter Python

  1. #1
    Membre averti
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Mai 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 25
    Par défaut Nommer dynamiquement des widgets ENTRY
    Bonjour tout le monde,

    Je me heurte à un problème.
    Je souhaite gérer la saisie sur un nombre indéterminé de lignes avec plus widgets ENTRY.
    La modification de ces widgets est associée à une fonction (la même fonction pour toutes les lignes).
    Je voudrais donc les nommer dynamiquement afin de pouvoir récupérer le contenu de la bonne ligne dans la fonction associée.

    Cela est il envisageable?

    En espérant avoir été à peu près clair... D'avance, merci.

    PS: Voici à quoi ressemble mon écan :
    Nom : 2014-02-26_105300.gif
Affichages : 726
Taille : 31,9 Ko

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 43
    Par défaut
    Bonjour,

    je vais essayer de faire un truc à ma sauce, je ne sais pas si ça va répondre à tes interrogations.

    Si j'ai bien compris tu souhaite gérer un nombre indéfini de widget Entry() mais pour les utiliser tu voudrais qu'ils soient correctement identifiés. En gros si tu as x Entry() tu voudrais qu'elles soient identifiés Entree1, Entree2, ..., Entreex? Si c'est ce qui te bloque tu peux peut être passer par "globals()" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from Tkinter import *
    fenetre = Tk()
    NbrEntry = 6
    NameEntry = []
    for i in range(NbrEntry):
        globals()["Entree"+str(i)] = Entry(fenetre)
        globals()["Entree"+str(i)].pack()
        NameEntry.append("Entree"+str(i))
    Les différents Entry() existants sont alors stockés dans "NameEntry". Après je dois avouer que tout ça fait un peu bricolage....

  3. #3
    Membre averti
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Mai 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 25
    Par défaut
    Merci!!!!

    Je suis un autodidacte débutant...
    J'ai essayé, le souci, c'est que je ne sais pas comment récupérer la valeur saisie dans l'entry.
    J'ai toujours la valeur de la dernière entry créée, lorsque je modifie une entry et que je fais "return".

    j'ai un peu implémenté ton 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
    15
    16
    17
    18
    19
    # -*- coding: iso-8859-15 -*-
    from tkinter import *
    import tkinter.ttk as ttk
    def affich(evt):
        print(globals()["Entree"+str(0)].get()) 
        print(globals()["Entree"+str(i)].get()) 
    fenetre = Tk()
    NbrEntry = 6
    NameEntry = []
    for i in range(NbrEntry):
        xn_entree=StringVar()
        xn_entree.set("Entree"+str(i))
     
        globals()["Entree"+str(i)] = Entry(fenetre, bg ="ivory", width =20,justify=CENTER,textvariable=xn_entree, borderwidth=2, relief=RIDGE)
        globals()["Entree"+str(i)].bind("<Return>", affich)
        globals()["Entree"+str(i)].pack()
        NameEntry.append("Entree"+str(i))
     
    fenetre.mainloop()

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 43
    Par défaut
    Je suis un autodidacte débutant...
    Comme ça on est deux

    J'ai essayé, le souci, c'est que je ne sais pas comment récupérer la valeur saisie dans l'entry.
    J'ai toujours la valeur de la dernière entry créée, lorsque je modifie une entry et que je fais "return".
    Pour récupérer la valeur de l'entry il faut bien que tu passe par "get()" comme tu le fais déjà. Le truc c'est que dans le code que tu me donne il y a:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def affich(evt):
        print(globals()["Entree"+str(0)].get()) 
        print(globals()["Entree"+str(i)].get())
    Bien que je ne comprenne pas trop ce que tu veuille faire par là, tu as un i qui n'est pas en paramètre et un paramètre "evt" que tu n'utilise pas. Du coup, si en console tu appel affich(), il s'affichera ce qui est contenu dans Entry0 et ce qu'il y a dans le dernier Entry.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Mai 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 25
    Par défaut
    Bien que je ne comprenne pas trop ce que tu veuille faire par là, tu as un i qui n'est pas en paramètre et un paramètre "evt" que tu n'utilise pas. Du coup, si en console tu appel affich(), il s'affichera ce qui est contenu dans Entry0 et ce qu'il y a dans le dernier Entry.
    la fonction affich() est activée par l'appui sur la touche RETURN sur une quelconque des zones ENTRY d'ou le paramètre "evt".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        globals()["Entree"+str(i)].bind("<Return>", affich)
    Idéalement, j'aimerais pouvoir passer la valeur du i dans la fonction...
    Mon problème, c'est de savoir, dans affich(), quelle zone ENTRY a provoqué l'action.
    Je veux récupérer cette valeur pour la stocker dans une base de données!!

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 43
    Par défaut
    Bon, en gros tu veux que quand tu modifie le champ d'un Entry, tu puisse récupérer ce champ lors de l’événement <Return>? Tu peux surement te débrouiller avec .widget:

    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
    # -*- coding: iso-8859-15 -*-
    from tkinter import *
    import tkinter.ttk as ttk
    def affich(evt):
        w = evt.widget
        print w.get()
     
    fenetre = Tk()
    NbrEntry = 6
    NameEntry = []
    for i in range(NbrEntry):
        xn_entree=StringVar()
        xn_entree.set("Entree"+str(i))
     
        globals()["Entree"+str(i)] = Entry(fenetre, bg ="ivory", width =20,justify=CENTER,textvariable=xn_entree, borderwidth=2, relief=RIDGE)
        globals()["Entree"+str(i)].bind("<Return>", affich)
        globals()["Entree"+str(i)].pack()
        NameEntry.append("Entree"+str(i))
    J'espère bien répondre à ta question...

  7. #7
    Membre averti
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Mai 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 25
    Par défaut
    Encore merci pour ton investissement!!
    Tu a parfaitement répondu avec les éléments que je t'ai donnés.
    Je vais encore abuser...

    Une ligne contient plusieurs widgets ENTRY.
    Pour mettre à jour ma base de données, j'aurais besoin de récupérer la valeur de tous les widgets de la ligne.
    En l'occurrence, le nom du widget me conviendrait bien, puisque le nom est suffixé par le numéro de ligne (entree0, entree1, ......)
    Si tu as encore une solution dans ton sac, je suis preneur!! .

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 083
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 083
    Par défaut
    Si on regarde bien ton image dans le 1er post, tu as une ligne de 4 colonnes.

    Je considérerais ceci

    Une frame représente une ligne de 4 colonnes (4 Entry)

    Voilà un code que je proposerais, j'ai pas testé, faut rajouter boutons, event, fonction à associer, etc...

    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
    from tkinter import *
     
    class Line(Frame):
        '''create a line of nbColumn columns, default is 4 columns'''
        def __init__(self, master=None, nbColumn=4, posLine=0, posColumn=0):
            Frame.__init__(self, master)
     
            self.col = nbColumn
            self.posx = posLine
            self.posy = posColumn
            self.entries = []
     
            self.createEntries()
            self.grid(row=posLine, column=posColumn)
     
        def createEntries(self):
            for i in range(self.col):
                ent = Entry(self)
                ent.grid(row=0, column=i)
                self.entries.append(ent)
     
        def getResult(self, column):
            if 0 <= column < self.col:
                return self.entries[column].get()
     
    def constructLines(master, nbLines):
        '''return list of objects Line, nbLines -> number of Line object'''
        lines = []
        for n in range(nbLines):
            line = Line(master, posLine=n)
            lines.append(line)
        return lines
     
    def getEntry(lines, posLine, posColumn):
        '''get value of line (number posLine) in column (number posColumn)'''
        myColumn = lines[posLine]
        return myColumn.getResult(posColumn)
     
    root = Tk()
     
    lines = constructLines(root, 8) # liste des lignes (8) de 4 colonnes
     
    root.mainloop()

  9. #9
    Membre averti
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Mai 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 25
    Par défaut
    Merci fred pour ta réponse.

    Hélas, je crains que ta solution ne dépasse mes maigres compétences.
    Je fais un petit logiciel pour mon association.
    Cela m'obligerait à revoir tout mon code... que j'ai déjà eu beaucoup de mal à mettre au point!!
    Il ne manque plus que ce point à résoudre.

    Je vais essayer d'aller au bout de la solution de Viand0x.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 43
    Par défaut
    Hello,

    La solution de Fred est bien moins brouillon que la miennes!

    Si tu veux que je t'aide à continuer à bidouiller il faudrait que tu me donne plus de vision sur ton code actuel. Je ne sais pas comment tu dispose actuellement tes Entry() ni comment son nommés les Entry de tes colonnes, ça m'aiderait à te proposer une solution.

  11. #11
    Membre averti
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Mai 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 25
    Par défaut
    Allez... on bidouille!!

    j'ai implémenté le code ci-dessus pour me rapprocher de mon problème.
    Les commentaires dans le code expliquent ce que dont j'aurais besoin :

    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
    # -*- coding: iso-8859-15 -*-
    from tkinter import *
    import tkinter.ttk as ttk
     
    def affich(evt):
    ## Ici je voudrais récupérer les valeurs des ENTRYs : 
    ## Jeu et score de la ligne sur laquelle la saisie 
    ## a été validée par la touche <return>
     
        w = evt.widget
        print("w.get() =", w.get())
     
    ## Pour l'instant, je ne sais récupérer que l'ENTRY qui a initié la fonction affich() 
    ## Il me faudrait, en même temps, quelquechose du genre : 
    ##       w_jeu=evt.widget.jeu
    ##       w_score=evt.widget.score
     
    fenetre = Tk()
    NbrEntry = 6
    NameEntryJeu, NameEntryScore = [],[]
     
    for i in range(NbrEntry):
        fr_ligne =Frame(fenetre, bg="#ebb4c5")
        fr_ligne.pack(side=TOP, expand=Y, fill=BOTH)
     
        xn_jeu=StringVar()
        xn_jeu.set("jeu"+str(i))
        globals()["jeu"+str(i)] = Entry(fr_ligne, width =20, textvariable=xn_jeu)
        globals()["jeu"+str(i)].bind("<Return>", affich)
        globals()["jeu"+str(i)].pack(side=LEFT)
        NameEntryJeu.append("jeu"+str(i))
     
        xn_score=StringVar()
        xn_score.set("score"+str(i))
        globals()["score"+str(i)] = Entry(fr_ligne, width =20, textvariable=xn_score)
        globals()["score"+str(i)].bind("<Return>", affich)
        globals()["score"+str(i)].pack(side=LEFT)
        NameEntryScore.append("score"+str(i))
     
    fenetre.mainloop()
    Nom : 2014-02-27_152617.gif
Affichages : 573
Taille : 4,6 Ko

    Par exemple, si j'arrive à savoir que c'est la saisie de l'ENTRY score1 qui a déclenché la fonction affich(), je pourrais récupérer les valeurs jeu1.get() et score1.get().

    Si tu arrives à me faire tourner ça... c'est gagné!!
    Encore merci.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 43
    Par défaut
    Gros niveau de bidouillage:

    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
    # -*- coding: iso-8859-15 -*-
    from tkinter import *
    import tkinter.ttk as ttk
     
    def affich(evt):
    ## Ici je voudrais récupérer les valeurs des ENTRYs : 
    ## Jeu et score de la ligne sur laquelle la saisie 
    ## a été validée par la touche <return>
        global EntryJeu, EntryScore
        w = evt.widget
            for i in range(len(EntryJeu)):
                if w == EntryJeu[i] or w == EntryScore[i]:
                    print("jeu"+str(i)+".get() =", EntryJeu[i].get())
                    print("score"+str(i)+".get() =", EntryScore[i].get())
     
    ## Pour l'instant, je ne sais récupérer que l'ENTRY qui a initié la fonction affich() 
    ## Il me faudrait, en même temps, quelquechose du genre : 
    ##       w_jeu=evt.widget.jeu
    ##       w_score=evt.widget.score
     
    fenetre = Tk()
    NbrEntry = 6
    EntryJeu, EntryScore = [],[]
     
    for i in range(NbrEntry):
        fr_ligne =Frame(fenetre, bg="#ebb4c5")
        fr_ligne.pack(side=TOP, expand=Y, fill=BOTH)
     
        xn_jeu=StringVar()
        xn_jeu.set("jeu"+str(i))
        globals()["jeu"+str(i)] = Entry(fr_ligne, width =20, textvariable=xn_jeu)
        globals()["jeu"+str(i)].bind("<Return>", affich)
        globals()["jeu"+str(i)].pack(side=LEFT)
        EntryJeu.append(globals()["jeu"+str(i)])
     
        xn_score=StringVar()
        xn_score.set("score"+str(i))
        globals()["score"+str(i)] = Entry(fr_ligne, width =20, textvariable=xn_score)
        globals()["score"+str(i)].bind("<Return>", affich)
        globals()["score"+str(i)].pack(side=LEFT)
        EntryScore.append(globals()["score"+str(i)])
     
    fenetre.mainloop()
    Bon, après j'aurai aimé éviter de devoir comparer "w" à tout les "Entry" pour retrouver lequel c'est... Aussi j'en profite pour pauser une question:

    Si j'ai bien compris comment python gère les affectations, on a des noms de variables (ex: Jeu0, Jeu1...etc) qui "pointent" vers les valeurs qu'ils doivent retourner. Est-il possible de faire le chemin inverse? (connaitre les variables qui pointent vers un valeur donnée)

  13. #13
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 083
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 083
    Par défaut
    La méthode winfo_children retourne la liste de tous les widgets enfants de la classe mère, il te suffit de tester avec la classe winfo_class si c'est un widget Entry et avec sa méthode get comparer une valeur souhaitée...

    Bonne continuation.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 43
    Par défaut
    Je n'avais pas vu que t'avais mis une "Frame" par ligne, du coup y'a plus propre en passant en effet pas .winfo_children() et .master:

    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
    # -*- coding: iso-8859-15 -*-
    from tkinter import *
    import tkinter.ttk as ttk
     
    def affich(evt):
    	w = evt.widget
    	for i in range(len(w.master.winfo_children())):
    		print w.master.winfo_children()[i].get()
     
    ## w.master te donne la Frame qui contient le widget qui a subit l’événement
    ## w.master.winfo_children() te donne donc la liste des enfants de la Frame solicitée
    ## Du coup on peut dire que
    ##       w_jeu=w.master.winfo_children()[0]
    ##       w_score=w.master.winfo_children()[1]
     
    fenetre = Tk()
    NbrEntry = 6
    EntryJeu, EntryScore = [],[]
     
    for i in range(NbrEntry):
    	fr_ligne =Frame(fenetre, bg="#ebb4c5")
    	fr_ligne.pack(side=TOP, expand=Y, fill=BOTH)
     
    	xn_jeu=StringVar()
    	xn_jeu.set("jeu"+str(i))
    	globals()["jeu"+str(i)] = Entry(fr_ligne, width =20, textvariable=xn_jeu)
    	globals()["jeu"+str(i)].bind("<Return>", affich)
    	globals()["jeu"+str(i)].pack(side=LEFT)
    	EntryJeu.append(globals()["jeu"+str(i)])
     
    	xn_score=StringVar()
    	xn_score.set("score"+str(i))
    	globals()["score"+str(i)] = Entry(fr_ligne, width =20, textvariable=xn_score)
    	globals()["score"+str(i)].bind("<Return>", affich)
    	globals()["score"+str(i)].pack(side=LEFT)
    	EntryScore.append(globals()["score"+str(i)])
     
    fenetre.mainloop()
    Sinon, ce que je me demandais en règle générale c'était: si j'ai a = 5 , b = 7 et c = 5, existe t'il un fonction ou je met en argument 5 et qui me retourne "a" et "b"?

  15. #15
    Membre averti
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Mai 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 25
    Par défaut
    Citation Envoyé par Viand0x Voir le message
    Je n'avais pas vu que t'avais mis une "Frame" par ligne, du coup y'a plus propre en passant en effet pas .winfo_children() et .master:
    J'aurais pu te le dire...

    Cela devient de moins en moins sale.
    le "for in range" ne sert plus à 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    # -*- coding: iso-8859-15 -*-
    from tkinter import *
    import tkinter.ttk as ttk
     
    def affich(evt):
    	w = evt.widget
    ## w.master te donne la Frame qui contient le widget qui a subit l’événement
    ## w.master.winfo_children() te donne donc la liste des enfants de la Frame solicitée
    ## Du coup on peut dire que
           w_jeu=w.master.winfo_children()[0].get()
           w_score=w.master.winfo_children()[1].get()
     
    fenetre = Tk()
    NbrEntry = 6
    EntryJeu, EntryScore = [],[]
     
    for i in range(NbrEntry):
    	fr_ligne =Frame(fenetre, bg="#ebb4c5")
    	fr_ligne.pack(side=TOP, expand=Y, fill=BOTH)
     
    	xn_jeu=StringVar()
    	xn_jeu.set("jeu"+str(i))
    	globals()["jeu"+str(i)] = Entry(fr_ligne, width =20, textvariable=xn_jeu)
    	globals()["jeu"+str(i)].bind("<Return>", affich)
    	globals()["jeu"+str(i)].pack(side=LEFT)
    	EntryJeu.append(globals()["jeu"+str(i)])
     
    	xn_score=StringVar()
    	xn_score.set("score"+str(i))
    	globals()["score"+str(i)] = Entry(fr_ligne, width =20, textvariable=xn_score)
    	globals()["score"+str(i)].bind("<Return>", affich)
    	globals()["score"+str(i)].pack(side=LEFT)
    	EntryScore.append(globals()["score"+str(i)])
     
    fenetre.mainloop()
    Sinon, ce que je me demandais en règle générale c'était: si j'ai a = 5 , b = 7 et c = 5, existe t'il un fonction ou je met en argument 5 et qui me retourne "a" et "b"?
    Là, désolé, je ne peux te répondre.
    Je laisse ouvert en attendant que tu aies une réponse?

    En tout cas, merci à Viand0x et à Fred, pour votre aide efficace.

  16. #16
    Membre averti
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Mai 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 25
    Par défaut
    ça va même finir par être "presque" propre!!
    Avec un peu de sommeil en plus, on peut se passer des GLOBALS et des tuples...

    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
    # -*- coding: iso-8859-15 -*-
    from tkinter import *
    import tkinter.ttk as ttk
     
    def affich(evt):
    	w = evt.widget
    	w_jeu=w.master.winfo_children()[0].get()
    	w_score=w.master.winfo_children()[1].get()
    	print("w_jeu =", w_jeu)
    	print("w_score =", w_score)
     
    fenetre = Tk()
    NbrEntry = 6
     
    for i in range(NbrEntry):
    	fr_ligne =Frame(fenetre, bg="#ebb4c5")
    	fr_ligne.pack(side=TOP, expand=Y, fill=BOTH)
     
    	xn_jeu=StringVar()
    	xn_jeu.set("jeu"+str(i))
    	jeu = Entry(fr_ligne, width =20, textvariable=xn_jeu)
    	jeu.bind("<Return>", affich)
    	jeu.pack(side=LEFT)
     
    	xn_score=StringVar()
    	xn_score.set("score"+str(i))
    	score = Entry(fr_ligne, width =20, textvariable=xn_score)
    	score.bind("<Return>", affich)
    	score.pack(side=LEFT)
     
    fenetre.mainloop()

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 43
    Par défaut
    En effet, avec .master et .winfo_children tu n'a plus besoin des globals(), c'est "presque" propre

    Pour le range() je te l'avais laissé car, sur ton image, j'avais l'impression que tu avais plus de deux Entry() par ligne (de toute façon tu saura très bien t'en sortir).

    Pour "ma question", j'ai cherché un peu et en fait les noms de variables sont stockés dans un "espace de noms" qui sont accessibles par "globals()" et "locals()". Ce sont des dictionnaires avec en keys les noms des variables et en values les valeurs assignés à ces variables. On peut donc retrouver l'ensemble des variables qui sont assignés à 5 en faisant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in range(len(globals())):
        if globals().values()[i] == 5:
            print globals().keys()[i]
    J'avais pensé passer par ça à un moment pour résoudre ton problème mais c'est vrai que c'est encore du bidouillage...

    Bonne continuation pour ton projet associatif!

  18. #18
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 083
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 083
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in range(len(globals())):
        if globals().values()[i] == 5:
            print globals().keys()[i]
    Il y a un peu mieux il me semble

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dic = globals()
    for key in dic:
        if dic[key] == 5:
            print key

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 08/07/2012, 18h36
  2. Réponses: 0
    Dernier message: 12/12/2009, 16h40
  3. [lablgtk2] comment ajouter des widget dynamiquement?
    Par amiroushka dans le forum Caml
    Réponses: 4
    Dernier message: 06/11/2009, 21h21
  4. Plein écran et réactions des widgets Entry
    Par bdudout dans le forum Tkinter
    Réponses: 8
    Dernier message: 06/10/2009, 20h38
  5. Réponses: 2
    Dernier message: 31/08/2002, 14h00

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