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 :

Problème de récupération de variables


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Problème de récupération de variables
    Bonjour,

    je suis en train d'essayer de coder une interface graphique qui permette à l'utilisateur de choisir un modèle, puis de rentrer des valeurs et qui trace le graphe qui correspond. Je suis bloquée, je ne comprends pas du tout ce qui ne marche pas.
    - je n'arrive pas à récupérer la valeur que 'Double' enregistre plus tard dans mon code
    - lorsque je lance le code, il me dit qu'il ne peut pas convertir la valeur de ei.get() en float. Je pense que c'est parce qu'il n'attend pas que je rentre des valeurs et que j'appuie sur ok. Comment corriger cela ?

    Merci pour toute votre aide, je commence vraiment à desesperer.
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    # -*- coding: utf-8 -*-
     
    from tkinter import *
    import numpy as np
    import matplotlib.pyplot as plt
     
    class GUI:
        def __init__(self):
            self.root      = Tk()
            self.labelVariable = StringVar()
            self.root.title('Projet informatique')
            self.initialize()
            self.root.mainloop()
     
        def initialize(self):
            self.main = Frame(self.root)
            self.main.pack() 
     
            label = Label(self.main, textvariable=self.labelVariable, font=('courier',10,'bold'), anchor="w", fg="red", bg="white")
            label.pack()
            self.labelVariable.set("Modelisation de populations atteintes dun virus")
            v=Listbox(self.main)
            v.insert("end","Modele SIR")
            v.insert("end","Modele de Witowski")
            v.insert("end","Modele de Munz")
            v.insert("end","Modele avec traitement")
            v.bind("<Double-Button-1>", self.Double) 
            v.pack(expand=1,fill=BOTH)
     
     
        def Double(self,event):
            widget    = event.widget
            selection = widget.curselection()
            value     = widget.get(selection[0])
            self.newWindow(value)
            return(value)
     
        def ModifyTextarea(self,elem,msg,clear=None):
            elem.config(state=NORMAL)
            if clear:
                elem.delete(1.0, END)
            else:
                elem.insert(END,msg)
            elem.config(state=DISABLED)
        def newWindow(self,msg):
            top = Toplevel(self.root)
            q1 = Frame(top)
            q1.pack()
            top.grab_set()
            text = Text(q1,state=DISABLED,exportselection=True)
            text.pack()
            self.ModifyTextarea(text,msg)
     
            e1=Entry(q1)
            e2=Entry(q1)
            e3=Entry(q1)
            e4=Entry(q1)
            e5=Entry(q1)
            e6=Entry(q1)
            e1.pack()
            e2.pack()
            e3.pack()
            e4.pack()
            e5.pack()
            e6.pack()
     
            def zombies() :
                    a=float(e1.get())
                    b=float(e2.get())
                    ze=float(e3.get())
                    T=float(e4.get())
                    N=float(e5.get())
                    dt=float(e6.get())
                    n = T/dt
                    n=int(n)
                    t=np.zeros((n+1))
                    for i in range (0,n):
                        t[0]=0
                        t[i+1]=t[i]+dt
                    s = np.zeros((n+1))
                    z = np.zeros((n+1))
                    r = np.zeros((n+1))
                    s[0] = N-1
                    z[0] =1
                    r[0] = 0
     
                    for i in range (n-1):
                        s[i+1] = s[i] + dt*(-b*s[i]*z[i])
                        z[i+1] = z[i] + dt*(b*s[i]*z[i]-a*s[i]*z[i]+ze*r[i])
                        r[i+1] = r[i] + dt*(a*s[i]*z[i]- ze*r[i])
     
                        if s[i+1]<0 or s[i+1] >N:
                            s[i+1]=0
                            break
     
                        if z[i+1] > N or z[i+1] < 0:
                            z[i+1]=0
                            break
     
                        if r[i+1] <0 or r[i+1] >N:
                            r[i+1]=0
                            break
                        return (t,s,r,z,i+2)
     
            btnquit = Button(q1,width = 1,text = "Ok",command =zombies)
            btnquit.pack()
     
     
     
     
            t,s,r,z,i=zombies()
            plt.plot(t[:i],s[:i],'b')
            plt.plot(t[:i],z[:i],'r')
            plt.plot(t[:i],r[:i],'y')
            plt.show()
     
    if __name__ == "__main__":
        app = GUI()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par doule Voir le message
    - je n'arrive pas à récupérer la valeur que 'Double' enregistre plus tard dans mon code
    Techniquement, Double n'est qu'un "callback" i.e. une fonction appelée par tkinter lors d'un double-click et si c'est tkinter qui l'appelle, il n'y a que lui qui pourra récupérer ce que le "return" renvoie.

    Citation Envoyé par doule Voir le message
    - lorsque je lance le code, il me dit qu'il ne peut pas convertir la valeur de ei.get() en float. Je pense que c'est parce qu'il n'attend pas que je rentre des valeurs et que j'appuie sur ok. Comment corriger cela ?
    Effectivement appliquer float à une chaîne vide, plante avec "could not convert string to float".
    Soit vous supposez que l'utilisateur entrera des valeurs dans toutes les cases, soit vous ajoutez le code qui "vérifie que...".
    Ce qui passe par:
    • s'assurer qu'une Entry a bien été remplie avant de passer à la suivante,
    • ne pas autoriser la validation avant que toutes les Entry soient remplies.


    Pour s'assurer qu'une Entry a été bien remplie, vous pouvez vous inspirer de ce post. Pour contrôler le passage à l'Entry suivante, vous avez des exemples ici.

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

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    a raison de 2h d'info par semaine nos bases sont bancales (surtout que notre programe soit fini la semaine prochaine ..)Je n'ai pas compris le tutoriel pour être honnête. En essayant de lancer le def que lorsque les valeurs sont entrees nous avons :
    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
            if e1.get()!=""and e2.get()!="" and e3.get()!="" and e4.get()!="" and e5.get()!="" and e6.get()!="":
     
     
                def zombies() :
                    a=float(e1.get())
                    b=float(e2.get())
                    ze=float(e3.get())
                    T=float(e4.get())
                    N=float(e5.get())
                    dt=float(e6.get())
                    n = T/dt
                    n=int(n)
                    t=np.zeros((n+1))
                    for i in range (0,n):
                        t[0]=0
                        t[i+1]=t[i]+dt
                    s = np.zeros((n+1))
                    z = np.zeros((n+1))
                    r = np.zeros((n+1))
                    s[0] = N-1
                    z[0] =1
                    r[0] = 0
     
                    for i in range (n-1):
                        s[i+1] = s[i] + dt*(-b*s[i]*z[i])
                        z[i+1] = z[i] + dt*(b*s[i]*z[i]-a*s[i]*z[i]+ze*r[i])
                        r[i+1] = r[i] + dt*(a*s[i]*z[i]- ze*r[i])
                        if s[i+1]<0 or s[i+1] >N:
                            s[i+1]=0
                            break
     
                        if z[i+1] > N or z[i+1] < 0:
                            z[i+1]=0
                            break
     
                        if r[i+1] <0 or r[i+1] >N:
                            r[i+1]=0
                            break
                    return (t,s,r,z,i+2)
    ce qui renvoie comme erreur UnboundLocalError: local variable 'zombies' referenced before assignment.
    peu importe où on place le bouton ok.

    Que faut-il faire ?

    Merci de votre aide.

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    C'est normal puisqu'à la ligne 111 tu appelle zombies.

    Tu dois appeler ton traçage de courbe dans une fonction séparée.

    Quelque chose comme ça:
    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
     
    ...
            def zombies() :
                ...
     
                        if r[i+1] <0 or r[i+1] >N:
                            r[i+1]=0
                            break
                    self.trace(t, s, r, z, i+2)
                        #return (t,s,r,z,i+2)
     
            btnquit = Button(q1,width = 1,text = "Ok",command =zombies)
            btnquit.pack()
     
     
     
        def trace(self, t, s, r, z, i):
            #t,s,r,z,i=zombies()
            plt.plot(t[:i],s[:i],'b')
            plt.plot(t[:i],z[:i],'r')
            plt.plot(t[:i],r[:i],'y')
            plt.show()
    Mais il faudra toujours vérifier si une donnée existe réellement pour chaque edit ou utiliser des blocs try except.


    Edit: j'ai changé l'indentation de self.trace()

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci merci beaucoup, c'est tout bete mais je n'avais pas vu cette bêtise.
    En essayant d'ajouter un if je reçois une nouvelle erreur UnboundLocalError: local variable 'zombies' referenced before assignment.
    Je ne suis pas sûre de voir comment utiliser des try except.

    J'ai rajouté un widget entrée qui permet à l'utilisateur de confirmer son choix :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mod=e7.get()
     
            if mod==1 and e1.get()!="":        
                def zombies() :

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Montre ton nouveau code en entier, ta modification semble suspecte.

    Et comme, en plus, tu utilises une fonction imbriquée, ça ne simplifie pas les choses.

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Voici le code en entier. Je ne pense en effet pas que je puisse faire ça.

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
     
    from Tkinter import *
    import numpy as np
    import matplotlib.pyplot as plt
     
    class GUI:
        def __init__(self):
            self.root      = Tk()
            self.labelVariable = StringVar()
            self.root.title('Projet informatique')
            self.initialize()
            self.root.mainloop()
     
        def initialize(self):
            self.main = Frame(self.root)
            self.main.pack() 
     
            label = Label(self.main, textvariable=self.labelVariable, font=('courier',10,'bold'), anchor="w", fg="red", bg="white")
            label.pack()
            self.labelVariable.set("Modelisation de populations atteintes dun virus")
            v=Listbox(self.main)
            v.insert("end","Modele SIR")
            v.insert("end","Modele de Witowski")
            v.insert("end","Modele de Munz")
            v.insert("end","Modele avec traitement")
            v.bind("<Double-Button-1>", self.Double) 
            v.pack(expand=1,fill=BOTH)
     
     
        def Double(self,event):
            widget    = event.widget
            selection = widget.curselection()
            value     = widget.get(selection[0])
            self.newWindow(value)
     
     
        def ModifyTextarea(self,elem,msg,clear=None):
            elem.config(state=NORMAL)
            if clear:
                elem.delete(1.0, END)
            else:
                elem.insert(END,msg)
            elem.config(state=DISABLED)
        def newWindow(self,msg):
            top = Toplevel(self.root)
            q1 = Frame(top)
            q1.pack()
            top.grab_set()
            text = Text(q1,state=DISABLED,exportselection=True)
            text.pack()
            self.ModifyTextarea(text,msg)
     
            e1=Entry(top) #a
            e2=Entry(top)   #b
            e3=Entry(top) #ze
            e4=Entry(top) #T
            e5=Entry(top) #N
            e6=Entry(top) #dt
            e7=Entry(top) #modele
     
            e1.pack()
            e2.pack()
            e3.pack()
            e4.pack()
            e5.pack()
            e6.pack()
            e7.pack()
     
            mod=e7.get()
     
            if mod==1:        
                def zombies() :
                    a=float(e1.get())
                    b=float(e2.get())
                    ze=float(e3.get())
                    T=float(e4.get())
                    N=float(e5.get())
                    dt=float(e6.get())
                    n = T/dt
                    n=int(n)
                    t=np.zeros((n+1))
                    for i in range (0,n):
                        t[0]=0
                        t[i+1]=t[i]+dt
                    s = np.zeros((n+1))
                    z = np.zeros((n+1))
                    r = np.zeros((n+1))
                    s[0] = N-1
                    z[0] =1
                    r[0] = 0
     
                    for i in range (n-1):
                        s[i+1] = s[i] + dt*(-b*s[i]*z[i])
                        z[i+1] = z[i] + dt*(b*s[i]*z[i]-a*s[i]*z[i]+ze*r[i])
                        r[i+1] = r[i] + dt*(a*s[i]*z[i]- ze*r[i])
                        if s[i+1]<0 or s[i+1] >N:
                            s[i+1]=0
                            break
     
                        if z[i+1] > N or z[i+1] < 0:
                            z[i+1]=0
                            break
     
                        if r[i+1] <0 or r[i+1] >N:
                            r[i+1]=0
                            break
                    self.trace(t, s, r, z, i+2) 
     
            btnquit = Button(q1,width = 1,text = "Ok",command = zombies)
            btnquit.pack() 
     
        def trace(self,t, s, r, z, i):
     
               plt.plot(t[:i],s[:i],'b')
               plt.plot(t[:i],z[:i],'r')
               plt.plot(t[:i],r[:i],'y')
               plt.show()  
     
     
     
     
     
     
    if __name__ == "__main__":
        app = GUI()

  8. #8
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Il est préférable que tu restes à Python 3.

    En séparant la vérification des données ce sera plus clair, comme ceci:
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
        ...
        def newWindow(self,msg):
            top = Toplevel(self.root)
            q1 = Frame(top)
            q1.pack()
            #top.grab_set()
            text = Text(q1,state=DISABLED,exportselection=True)
            text.pack()
            self.ModifyTextarea(text,msg)
     
            e1=Entry(top) #a
            e2=Entry(top)   #b
            e3=Entry(top) #ze
            e4=Entry(top) #T
            e5=Entry(top) #N
            e6=Entry(top) #dt
     
            e1.pack()
            e2.pack()
            e3.pack()
            e4.pack()
            e5.pack()
            e6.pack()
            self.entries = [e1, e2, e3, e4, e5, e6]
            btnquit = Button(q1,width = 1,text = "Ok",command = self.zombies)
            btnquit.pack()
     
        def get_entries(self):
            values = []
            for entry in self.entries:
                try:
                    values.append(float(entry.get()))
                except ValueError:
                    return
     
            return values
     
        def zombies(self):
            entries = self.get_entries()
            if entries is None:
                # Toutes les entrées ne sont pas validées, on ignore
                return
            a, b, ze, T, N, dt = entries
            n = T/dt
            n=int(n)
            t=np.zeros((n+1))
            # FIXME i n'est pas toujours créé
            i = 0
            for i in range(0, n):
                t[0]=0
                t[i+1]=t[i]+dt
            s = np.zeros((n+1))
            z = np.zeros((n+1))
            r = np.zeros((n+1))
            s[0] = N-1
            z[0] =1
            r[0] = 0
     
            for i in range(n-1):
                s[i+1] = s[i] + dt*(-b*s[i]*z[i])
                z[i+1] = z[i] + dt*(b*s[i]*z[i]-a*s[i]*z[i]+ze*r[i])
                r[i+1] = r[i] + dt*(a*s[i]*z[i]- ze*r[i])
                if s[i+1] < 0 or s[i+1] > N:
                    s[i+1] = 0
                    break
     
                if z[i+1] > N or z[i+1] < 0:
                    z[i+1] = 0
                    break
     
                if r[i+1] < 0 or r[i+1] > N:
                    r[i+1 ]= 0
                    break
            self.trace(t, s, r, z, i+2)  
     
        def trace(self, t, s, r, z, i):
            ...

  9. #9
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour ton aide, cette partie du programme est bouclée ! Merci vraiment

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/03/2007, 18h08
  2. [MySQL] Problème de récupération de variables en $_GET
    Par gussoner dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 07/11/2006, 11h38
  3. Réponses: 6
    Dernier message: 07/07/2006, 17h27
  4. [VBA-E]problème de récupération de variables et d'event
    Par zenix dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 24/04/2006, 12h53
  5. [MySQL] problèmes de récupération de variables
    Par bullrot dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 03/03/2006, 12h27

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