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 :

Récupérer le contenu des widgets entry pour pouvoir les comparer


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2012
    Messages : 39
    Points : 25
    Points
    25
    Par défaut Récupérer le contenu des widgets entry pour pouvoir les comparer
    Bonjour à tous.
    Encore un problème que je ne parviens pas à régler depuis quelques jours:
    je voulais récupérer le contenu de deux widgets entry pour pouvoir les comparer sachant que ce que l'utilisateur a entré dans ces widgets sont des nombres... Voici mon code sous Python v3.2.2 (tkinter):
    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
    ## Lecture diode ref
          label=tkinter.Label(self,text="Lecture diode ref",anchor="w") #création d'un label
            label.grid(column=0,row=19,pady=3) #emplacement du label
     
            for i in range(0,compteur_faisceaux):# pour créer autant de champ que de faisceaux
                self.entryVariable1=tkinter.StringVar() 
                self.entry=tkinter.Entry(self) #création d'un champ texte
                self.entry.grid(column=1+i,row=19, sticky='EW',padx=4) #emplacement du champ texte
                self.entryVariable1.set
                self.entry["textvariable"]=self.entryVariable1
    ## Lecture diode Coin
            label=tkinter.Label(self,text="Lecture diode Coin",anchor="w") #création d'un label
            label.grid(column=0,row=21,pady=3) #emplacement du label
     
            for i in range(0,compteur_faisceaux):# pour créer autant de champ que de faisceaux
                self.entryVariable2=tkinter.StringVar()
                self.entry=tkinter.Entry(self) #création d'un champ texte
                self.entry.grid(column=1+i,row=21, sticky='EW',padx=4) #emplacement du champ texte
                self.entryVariable2.set
                self.entry["textvariable"]=self.entryVariable2
     
                self.entry.bind("<Key-Return>",self.OnPressEnter)
    def OnPressEnter(self,event):
            text1=self.entryVariable1.get
            text2=self.entryVariable2.get
            if self.text2>self.text1
                button=tkinter.Button(self,bg="green",text='    ') #création d'un label pour les cases de couleurs
                button.grid(column=1+i,row=27) #emplacement du label
     
            else:
                button=tkinter.Button(self,bg="red",text='    ') #création d'un label pour les cases de couleurs
                button.grid(column=1+i,row=27) #emplacement du label
    J'ai comme erreur après l'exécution et une fois que j'ai rentré des nombre dans les widgets correspondants: AttributeError: 'tkapp' object has no attribute 'text2'

    Merci d'avance de votre aide

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    text1=self.entryVariable1.get()
    et donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            text1=self.entryVariable1.get()
            text2=self.entryVariable2.get()
            if int(text2)>int(text1): #et non self. int(..) car c'est une instance tkinter.StringVar
    Mais comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in range(0,compteur_faisceaux)
    vous écrasez ici les noms vous n'aurez accès qu'aux dernières variables.
    Essayer de stocker cela dans quelque chose, exemple une liste.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2012
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    Merci
    Si je fais la modification que vous m'indiquez je recois un message d'erreur après exécution du programme lorsque je rentre les deux valeurs à comparer:

    ValueError: invalid literal for int() with base 10: ''

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    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
    >>> text1 = "a"
    >>> int(text1)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: invalid literal for int() with base 10: 'a'
    >>> text1 = "1"
    >>> int(text1)
    1
    >>> text1 = "1.0"
    >>> int(text1)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: invalid literal for int() with base 10: '1.0'
    >>> float(text1)
    1.0
    Il suffit de tester en fait.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2012
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    Bonjour,
    c'est ce que j'avais fait mais il me donne en réponse :
    ValueError: could not convert string to float:

  6. #6
    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 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par nini_python Voir le message
    Bonjour,
    c'est ce que j'avais fait mais il me donne en réponse :
    ValueError: could not convert string to float:
    Quelque part, si vous n'assurez pas que l'entry contient toujours un float après sa modification, il sera difficile "plus tard" de traiter l'erreur de conversion.
    Voir la discussion pour voir comment faire cela.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Voila qui ne vas pas arranger le PO

    Tant qu'il continu a créer ses Entry/Variables dans son for sans en garder une référence et qu'il n'auras pas compris que les seuls noms qui restent sont ceux des derniers objets il ne s'y retrouveras pas.

    Maintenant si c'est pour jouer au 'widget fantôme':
    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
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    import sys
    running_python3 = sys.version_info[0] > 2
    if running_python3:
          import tkinter
    else:
          import Tkinter as tkinter
     
     
    class Demo(tkinter.Frame):
        def __init__(self, master):
            tkinter.Frame.__init__(self, master)
            self.master = master
            ## Lecture diode ref
    ################################################################################
            self.compteur_faisceaux = 4
            ###########################################
            tkinter.Label(self, text="Lecture diode ref",
                          anchor="w").grid(column=0, row=19, pady=3) #emplacement du label
            tkinter.Label(self, text="Lecture diode Coin",
                          anchor="w").grid(column=0, row=21, pady=3) #emplacement du label
            validatecmd = (self.master.register(self.OnValidate), '%S', '%W')
            for i in range(0, self.compteur_faisceaux):# pour créer autant de champ que de faisceaux
                tkinter.Entry(self, validate="key",
                              vcmd=validatecmd).grid(column=1+i, row=19,
                                                     sticky='EW', padx=4) #emplacement du champ texte
                entry = tkinter.Entry(self, validate="key", vcmd=validatecmd) #création d'un champ texte
                entry.grid(column=1+i, row=21, sticky='EW', padx=4) #emplacement du champ texte
                entry.bind("<Key-Return>", self.OnPressEnter)
     
        def OnValidate(self, S, W):
            currentw = self.master.nametowidget(W)
            if S.isdigit() or (S == '.' and '.' not in currentw.get()):
                return True
            return False
     
        def OnPressEnter(self, event):
            currentw = event.widget
            parent = self.master.nametowidget(currentw.winfo_parent())
            text2 = currentw.get()
            r = str(int(currentw.grid_info()['row'])-2)
            c = currentw.grid_info()['column']
            for w in parent.winfo_children():
                if w.grid_info()['row'] == r and w.grid_info()['column'] == c:
                    text1 = w.get()
                    break
            if float(text2) > float(text1):
                tkinter.Label(self,
                              bg="green",
                              text=' '*4).grid(column=2+self.compteur_faisceaux,
                                               row=27)
            else:
                tkinter.Label(self,
                              bg="red",
                              text=' '*4).grid(column=2+self.compteur_faisceaux,
                                             row=27)
    ################################################################################
     
     
    if __name__ == "__main__":
        root = tkinter.Tk()
        Demo(root).pack()
        root.mainloop()
    Seul self.compteur_faisceaux est a changer.

    Mais bon... Pourquoi chercher ce que l'on a créer alors qu'il est si facile d'en garder une trace...

    @+
    Merci d'utiliser le forum pour les questions techniques.

  8. #8
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Note: J'ai laisser une ValueError a tester pour le PO dans OnPressEnter, à lui de trouver
    Merci d'utiliser le forum pour les questions techniques.

  9. #9
    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 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par PauseKawa Voir le message
    Voila qui ne vas pas arranger le PO

    Tant qu'il continu a créer ses Entry/Variables dans son for sans en garder une référence et qu'il n'auras pas compris que les seuls noms qui restent sont ceux des derniers objets il ne s'y retrouveras pas.
    J'ai de la peine à m'investir dans un code aussi peu structuré.
    A priori, label, entry, variable pourraient être emballés dans une frame.
    Ce qui pourrait donner lieu à un composite et permettre un empilage "plus simple". Il ne devrait pas être utile de nommer les widgets, par contre, nommer les variables permettrait d'y accéder "simplement" depuis l'extérieur.
    Mais ca fait beaucoup de boulot et en plus le PO sera probablement largué.

    Pour l'instant, je joue avec la discussion. Mais j'ai de la peine à tailler les marches.

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

  10. #10
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Notes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                e1.bind("<Key-Return>", self.OnPressEnter)
                e2.bind("<Key-Return>", self.OnPressEnter)
                self.saisies[e2] = e1
                self.saisies[e1] = e2
    + Il reste toujours un test a faire dans OnPressEnter
    Un petit coup de pouce de début de semaine pour ce qui est des deux pièges que j'ai laisser:
    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
    >>> root = tk.Tk()
    >>> e = tk.Entry(root)
    >>> e.pack()
    >>> v = e.get()
    >>> v
    ''
    >>> type(v)
    <type 'str'>
    >>> len(v)
    0
    >>> int(v)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: invalid literal for int() with base 10: ''
    >>> float(v)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: could not convert string to float: 
    >>> v = e.get()
    >>> v
    '1'
    >>> int(v)
    1
    >>> float(v)
    1.0
    >>> v = e.get()
    >>> v
    '1.0'
    >>> int(v)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: invalid literal for int() with base 10: '1.0'
    >>> float(v)
    1.0
    Une fois que vous avez text1 et text2 vous devez vérifier qu'aucun des deux ne soit vide (l'utilisateur n'as rien rentrer) pour continuer. Pour ce qui est de la valeur la validation le l'Entry s'en occupe et pour float que cela soit '1' ou '1.0' pas de problème.

    Contrairement à votre code ou le bind est sur l'Entry du dessous j'ai rajouter dans le second code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                e1.bind("<Key-Return>", self.OnPressEnter)
                self.saisies[e1] = e2
    Vous pouvez le supprimer si cela vous chante, ce qui vous ramène à votre code.
    Si vous voulez gardez la possibilité de faire entrer sur les deux Entry pensez a modifier OnPressEnter en conséquence: Comprendre que vous devez identifier l'entrée pour pouvoir faire e1.get() > e2.get().
    Cela se passe ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    currentw = self.master.nametowidget(event.widget)
            text2 = currentw.get()
            text1 = self.saisies[currentw].get()
    Vous devez pouvoir dire si currentw correspond à e1 ou e2 pour text1 ou text2.
    Ou est la différence entre les deux Entry ? currentw.grid_info()['row'] est soit '19', soit '21'.

    @+ et bon code

    Edit: Ceci dit pour e1 j'aurais sans doute vu autre chose
    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
    67
    68
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    import sys
    running_python3 = sys.version_info[0] > 2
    if running_python3:
          import tkinter
    else:
          import Tkinter as tkinter
     
     
    class Demo(tkinter.Frame):
        def __init__(self, master):
            tkinter.Frame.__init__(self, master)
            self.master = master
            ## Lecture diode ref
    ################################################################################
            self.saisies = {}
            self.compteur_faisceaux = 4
            ###########################################
            tkinter.Label(self, text="Lecture diode ref",
                          anchor="w").grid(column=0, row=19, pady=3) #emplacement du label
            tkinter.Label(self, text="Lecture diode Coin",
                          anchor="w").grid(column=0, row=21, pady=3) #emplacement du label
            validatecmd = (self.register(self.OnValidate), '%S', '%W')
            for i in range(0, self.compteur_faisceaux):# pour créer autant de champ que de faisceaux
                e1 = tkinter.Entry(self, validate="key", vcmd=validatecmd)
                e1.grid(column=1+i, row=19, sticky='EW', padx=4) #emplacement du champ texte
                e2 = tkinter.Entry(self, validate="key", vcmd=validatecmd) #création d'un champ texte
                e2.grid(column=1+i, row=21, sticky='EW', padx=4) #emplacement du champ texte
                e1.bind("<Return>", self.NextEntry)
                e1.bind("<KP_Enter>", self.NextEntry)
                e2.bind("<Return>", self.OnPressEnter)
                e2.bind("<KP_Enter>", self.OnPressEnter)
                self.saisies[e2] = e1
                self.saisies[e1] = e2
     
        def OnValidate(self, S, W):
            currentw = self.nametowidget(W)
            if S.isdigit() or (S == '.' and '.' not in currentw.get()):
                return True
            return False
     
        def OnPressEnter(self, event):
            currentw = self.nametowidget(event.widget)
            text2 = currentw.get()
            text1 = self.saisies[currentw].get()
            if float(text2) > float(text1):
                tkinter.Label(self, bg="green",
                              text=' '*4).grid(column=2+self.compteur_faisceaux,
                                               row=27)
            else:
                tkinter.Label(self, bg="red",
                              text=' '*4).grid(column=2+self.compteur_faisceaux,
                                               row=27)
     
        def NextEntry(self, event):
            nextwidget = self.saisies[self.nametowidget(event.widget)]
            nextwidget.focus_set()
            nextwidget.select_range(0, tkinter.END)
    ################################################################################
     
     
    if __name__ == "__main__":
        root = tkinter.Tk()
        Demo(root).pack()
        root.mainloop()
    Note : reste toujours cette histoire de ''
    Merci d'utiliser le forum pour les questions techniques.

Discussions similaires

  1. Récupérer le nom des profiles utilisés pour la compilation
    Par thomas.huguerre dans le forum Maven
    Réponses: 2
    Dernier message: 23/04/2009, 12h24
  2. Réponses: 9
    Dernier message: 18/01/2009, 23h46
  3. récupérer le contenu des balise <script>
    Par GoldenEyes dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/06/2008, 13h08
  4. Récupérer le contenu d'un champs pour un calcul ?
    Par dark_vidor dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/01/2006, 10h25

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