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 Graph interactif Tkinter


Sujet :

Tkinter Python

  1. #1
    Nouveau Candidat au Club Avatar de Lisa36
    Femme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problème Graph interactif Tkinter
    Bonjour, j'ai un projet dans lequel je dois créer une interface permettant de modifier certaines variables et de voir les effets que cela a sur les courbes dépendant de ces variables. Mais j'ai plusieurs problèmes, mes variables 'temp' et Ensoleil semble être liées entre elles je ne sais pas trop comment et mes courbes ne se mettent pas à jour lorsque je change les variables.

    Si quelqu'un a une solution je suis preneuse (Je débute tout juste sur Python)

    Voici mon code source:

    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
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    # Créé par Lisa, le 14/10/2019
    from tkinter import * #on utilise tkinter pour créer l'ihm
    from pylab import * #on utilise Pylab pour faciliter le transfert du code Matlab sur Python
    import matplotlib
    matplotlib.use("TkAgg")
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
    from matplotlib.figure import Figure
    import tkinter as tk
    from tkinter import ttk
    import matplotlib.animation as animation
    from matplotlib import style
     
    def Ia(Va,Suns,TaC):     #function Ia = Projet(Va,Suns,TaC)
    # Tension appliqué au panneau, ensoleillement et temperature
    # Ia = Projet(Va,G,T) = array voltage
    # Ia,Va = courant, tension appliqué
    # G = nombre de soleil (1 Soleil = 1000 W/mˆ2)
    # T = Tempétature en Deg C
     
        k = 1.38e-23 #Costante de  Boltzman
        q = 1.60e-19 # charge d'un electron
     
    # enter the following constants here, and the model will be
    # calculated based on these. for 1000W/mˆ2
        A = 1.2 # "diode quality" factor, =2 for crystaline, <2 for amorphous
        Vg = 1.12 # band gap voltage, 1.12eV for xtal Si, ˜1.75 for amorphous Si.
        Ns = 36 # number of series connected cells (diodes)
     
        T1 = 273 + 25
        Voc_T1 = 21.06 /Ns # open cct voltage per cell at temperature T1
        Isc_T1 = 3.80 # short cct current per cell at temp T1
     
        T2 = 273 + 75
        Voc_T2 = 17.05 /Ns # open cct voltage per cell at temperature T2
        Isc_T2 = 3.92 # short cct current per cell at temp T2
     
        TaK = 273 + TaC # array working temp
        TrK = 273 + 25  # reference temp
     
    # when Va = 0, light generated current Iph_T1 = array short cct current
    # constant "a" can be determined from Isc vs T
     
        Iph_T1 = Isc_T1 * Suns
        a = (Isc_T2 - Isc_T1)/Isc_T1 * 1/(T2 - T1)
        Iph = Iph_T1 * (1 + a*(TaK - T1))
     
        Vt_T1 = k * T1 / q; # = A * kT/q
        Ir_T1 = Isc_T1 / (exp(Voc_T1/(A*Vt_T1))-1)
        Ir_T2 = Isc_T2 / (exp(Voc_T2/(A*Vt_T1))-1)
     
        b = Vg * q/(A*k)
        Ir = Ir_T1 * (TaK/T1)**(3/A) *exp(-b*(1/TaK - 1/T1))
     
        X2v = Ir_T1/(A*Vt_T1) * exp(Voc_T1/(A*Vt_T1))
        dVdI_Voc = - 1.15/Ns / 2; # dV/dI at Voc per cell –
                              # from manufacturers graph
        Rs = - dVdI_Voc - 1/X2v  # series resistance per cell
     
    # Ia = 0:0.01:Iph;
        Vt_Ta = A * 1.38e-23 * TaK / 1.60e-19 #=A*kT/q
     
    # Ia1 = Iph - Ir.*( exp((Vc+Ia.*Rs)./Vt_Ta) -1);
    # solve for Ia: f(Ia) = Iph - Ia - Ir.*( exp((Vc+Ia.*Rs)./Vt_Ta) -1) = 0;
    # Newton’s method: Ia2 = Ia1 - f(Ia1)/f’(Ia1)
     
        Vc = Va/Ns
        Ia = zeros(size(Vc))
    # Iav = Ia;
        for j in range(1,5):
            Ia = Ia - (Iph - Ia - Ir*( exp((Vc+Ia*Rs)/Vt_Ta) -1))/ (-1 - (Ir*( exp((Vc+Ia*Rs)/Vt_Ta) -1))*Rs/Vt_Ta)
    # Iav = [Iav;Ia]; % to observe convergence for debugging.
        return Ia
     
    class Interface(tk.Frame):
     
     # Création de la fenêtre principale
        IHM = Tk()
        IHM.title('Interface Homme-Machine')
     
        # création d'un widget Frame dans la fenêtre principale
        Frame1 = Frame(IHM,borderwidth=2,relief=GROOVE)
        Frame1.pack(side=LEFT,padx=10,pady=10)
        Frame1.place(x=1200,y=10)
     
        #On renomme le frame
        Label(Frame1,text="Réglage de l'ensoleillement et de la température").pack(padx=10,pady=10)
     
        #on met un scale horizontale dans le premier frame pour l'ensoleillement
        Ensoleil = 0
        ensoleillement= Scale(Frame1, orient='horizontal', from_=0, to=1000,resolution=0, tickinterval=100, length=350, variable=Ensoleil,label='Ensoleillement (W/m²)')
        ensoleillement.pack(padx=10,pady=10)
        Var1 = Entry(Frame1, textvariable= Ensoleil)
        Var1.focus_set()
        Var1.pack(side = LEFT, padx = 5, pady = 5)
        Var1.place(x=240,y=55)
     
        #on met un deuxième scale horizontale dans le premier frame pour la température
        Temp= 0
        Temperature= Scale(Frame1, orient='horizontal', from_=0, to=100,resolution=0, tickinterval=10, length=350, variable=Temp ,label='Température (°C)')
        Temperature.pack(padx=10,pady=10)
        Var2 = Entry(Frame1, textvariable= Temp)
        Var2.focus_set()
        Var2.pack(side = LEFT, padx = 5, pady = 5)
        Var2.place(x=240,y=155)
     
        # création d'un troisième widget Frame dans la fenêtre principale
        Frame3 = Frame(IHM,borderwidth=2,relief=GROOVE)
        Frame3.pack(side=LEFT,padx=10,pady=10)
        Frame3.place(x=1200,y=550)
     
        #On renomme le frame
        Label(Frame3,text="Réglage du rapport cyclique du convertisseur Buck").pack(padx=10,pady=10)
     
        #on met un scale horizontale dans le troisième frame pour le rapport cyclique
        Rapp= 0.0
        Rapport= Scale(Frame3, orient='horizontal', from_=0, to=1,resolution=0.01, tickinterval=0.1, length=350, variable=Rapp ,label='Rapport cyclique de Buck')
        Rapport.pack(padx=10,pady=10)
        Var4 = Entry(Frame3, textvariable= Rapp)
        Var4.focus_set()
        Var4.pack(side = LEFT, padx = 5, pady = 5)
        Var4.place(x=240,y=55)
     
        V=linspace(0,30,100) # On prend une centaine de valeur de V entre 0 et 30
        #Le rapport cyclique entre 0 et 1
     
        Vref=V*Rapp #on multiplie la tension d'entrée par le rapport cyclique
        #ensoleillement entre 0 et 1
        Suns=Ensoleil/1000
     
        #I=f(v)
        Itemp1=Ia(V,Suns,Temp)
        I1=Itemp1/Rapp
     
        #P=f(v)sans rapport cyclique
        P11=V*Itemp1
     
        #P=f(v)avec rapport cyclique
        P1=Vref*I1
     
        #tracer des courbes
        fig = Figure(figsize=(12, 8), dpi=96)
        a1 = fig.add_subplot(121)
        a1.plot(V,Itemp1)
        a1.plot(Vref,I1)
        a1.axes.set_ylim(0, 10)
        a1.grid()
     
        a2 = fig.add_subplot(122)
        a2.plot(V,P11)
        a2.plot(Vref,P1)
        a2.axes.set_ylim(0, 100)
        a2.grid()
     
        graph1 = FigureCanvasTkAgg(fig, IHM)
        canvas1 = graph1.get_tk_widget()
        canvas1.pack(side=LEFT)
     
        IHM.mainloop()

  2. #2
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    14 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 14 468
    Points : 24 475
    Points
    24 475
    Par défaut
    Salut,

    Citation Envoyé par Lisa36 Voir le message
    et de voir les effets que cela a sur les courbes dépendant de ces variables. Mais j'ai plusieurs problèmes, mes variables 'temp' et Ensoleil semble être liées entre elles je ne sais pas trop comment
    Les variables à passer aux widgets tkinter sont des variables Tk créées via StringVar, IntVar,...
    La vous passez l'objet Python 0 et la variable fabriquée à partir de çà sera toujours la même:

    Essayez ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> import tkinter as tk
    >>> root = tk.Tk()
    >>> e = tk.Entry(root, textvariable=0)
    >>> e.pack()
    >>> f = tk.Entry(root, textvariable=0)
    >>> f.pack()
    >>> g = tk.Entry(root, textvariable=1)
    >>> g.pack()
    >>> tk.mainloop()
    e et f sont "liés", g est "libre".

    Et comme vous voulez récupérez ce que l'utilisateur à tapé pour l'utiliser par ailleurs, vous n'avez pas le choix: StringVar, IntVar,....

    note: quelque soit la bibliothèque que vous utilisez vous êtes supposé comprendre comment elle fonctionne avant de faire quoi que ce soit avec.
    SI vous écrivez n'importe quoi çà fera n'importe quoi (sans toujours vous le signaler par un message d'erreur).

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

  3. #3
    Nouveau Candidat au Club Avatar de Lisa36
    Femme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    D'accord merci beaucoup j'ai pu régler le problème de mes variables liées entre elles mais je ne comprend pas trop la méthode pour récupérer les valeurs des Entry pour pouvoir les réutiliser. Je dois me servir d'un get ?

    Voilà une partie du nouveau code que j'ai pu faire avec un test pour récupérer la variable:

    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
    import tkinter as tk
    from tkinter import *
     
    root = tk.Tk()
    e1=IntVar()
    e = tk.Entry(root, textvariable= e1)
    e.pack(side = LEFT, padx = 5, pady = 5)
    e.place(x=240,y=55)
    ensoleillement= Scale(root, orient='horizontal', from_=0, to=1000,resolution=0, tickinterval=100, length=350, variable=e1,label='Ensoleillement (W/m²)')
    ensoleillement.pack(padx=10,pady=10)
     
    t1=IntVar()
    t = tk.Entry(root, textvariable= t1)
    t.pack(side = LEFT, padx = 5, pady = 5)
    t.place(x=240,y=155)
    Temperature= Scale(root, orient='horizontal', from_=0, to=100,resolution=0, tickinterval=10, length=350, variable=t1 ,label='Température (°C)')
    Temperature.pack(padx=10,pady=10)
     
    a=e1.get()
    b=t1.get()
     
    k=a*b
     
    L = Label(root, text=k)
    L.pack
    L.place(x=240,y=355)
     
    tk.mainloop()

  4. #4
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    14 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 14 468
    Points : 24 475
    Points
    24 475
    Par défaut
    Citation Envoyé par Lisa36 Voir le message
    je ne comprend pas trop la méthode pour récupérer les valeurs des Entry pour pouvoir les réutiliser. Je dois me servir d'un get ?
    Ajoutez print('toto') à la ligne 27. Il va s'afficher avant que l'utilisateur ait pu saisir quoi que ce soit. Et ce genre d'erreur reflète une incompréhension du fonctionnement de tkinter qui ne peut être résolue qu'en passant par la case tuto..

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

Discussions similaires

  1. Problème de fenêtres Tkinter
    Par nicogigo dans le forum Tkinter
    Réponses: 2
    Dernier message: 04/04/2010, 05h39
  2. [XL-2003] Macro : copie de feuilles dans un autre classeur : problèmes graphs + divers
    Par gandalf20000000 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 16/10/2009, 11h52
  3. [WB14] Graphe interactif
    Par xaaros dans le forum WebDev
    Réponses: 0
    Dernier message: 19/08/2009, 12h23
  4. problème graph XY
    Par clemnantes dans le forum LabVIEW
    Réponses: 1
    Dernier message: 06/08/2009, 01h32
  5. Problème graphe "NewSeries"
    Par Maxoow dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 05/06/2009, 16h55

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