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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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
    Membre Expert 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
    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.

    @+

  3. #3
    Membre averti
    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
    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
    Membre Expert 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
    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.

    @+

  5. #5
    Membre averti
    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
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 772
    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 772
    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
    Membre Expert 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
    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...

    @+

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