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

Python Discussion :

Graphique en direct avec canvas


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut Graphique en direct avec canvas
    Bonjour, je suis entrain de faire un code me permettant d’afficher mes données en direct.... Jusqu'à là tout va bien, cela marche parfaitement avec matplotlib mais le problème c'est que dès lors que je souhaite l'afficher sur canvas,
    cela ne marche pas et tkinter plante littéralement....

    voici mon code qui marche correctement sous matplotlib:
    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
    import serial
    import numpy as np
    import matplotlib.pyplot as plt
    from drawnow import *
    import tkinter as tk
    from matplotlib.ticker import MultipleLocator, FormatStrFormatter
     
     
    app = tk.Tk()
     
     
    def launch_Graph():
        tempC = []
        arduino_Data = serial.Serial("com4",9600)
        plt.ion() #interactive mode (live data)
        cnt=0
        def makeFig():
            ay = plt.axes()
            ay.yaxis.set_major_locator(MultipleLocator(1))
            ay.yaxis.set_minor_locator(MultipleLocator(0.5))
            plt.ylim(0,30)
            plt.title("Temperature as function time")
            plt.grid(True)
            plt.ylabel("Temp (°C)")
            plt.xlabel("Time (s)")
            plt.plot(Data)
            """
            plt.plot(Data,"rx-",label="Degrees")
            plt.legend(loc="upper left")
            """
     
     
     
        while True:
            tempC.append(str(arduino_Data.readline()))
            def cleanData(L):
                newL = []
                for i in range(len(L)):
                    temp=L[i][2:]
                    newL.append(float(temp[:-5]))
                return newL
            Data = cleanData(tempC)
            drawnow(makeFig) # for draw the figure
            plt.pause(.000001)
            cnt+=1
            if(cnt>50):    # if there is 50 time the same value matplotlib set pause
                Data.pop(0)
     
    btn = tk.Button(app,command=launch_Graph).pack()
     
    app.mainloop()



    et celui qui plante.... :
    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
    import serial
    import numpy as np
    import matplotlib.pyplot as plt
    from drawnow import *
    import tkinter as tk
    from matplotlib.ticker import MultipleLocator, FormatStrFormatter
    from matplotlib.figure import Figure
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
     
     
    app = tk.Tk()
     
     
    def launch_Graph():
        tempC = []
        arduino_Data = serial.Serial("com4",9600)
     
     
        f = Figure(figsize=(6,4), dpi=100)
        a_1 = f.add_subplot(111)
     
        def makeFig():
            line_graphic_1, =a_1.plot(Data)
     
     
     
        while True:
            tempC.append(str(arduino_Data.readline()))
            def cleanData(L):
                newL = []
                for i in range(len(L)):
                    temp=L[i][2:]
                    newL.append(float(temp[:-5]))
                return newL
            Data = cleanData(tempC)
     
        canvas = FigureCanvasTkAgg(f, app)
        canvas.draw()
        canvas.get_tk_widget().place(x=500, y =100 ,width=800, height=800)
     
        toolbar = NavigationToolbar2Tk(canvas, app)
        toolbar.update()
        canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
     
     
     
    btn = tk.Button(app,command=launch_Graph).pack()
     
    app.mainloop()

    Merci d'avance,
    bonne journée

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 705
    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 705
    Par défaut
    Salut,

    2 choses.
    Il faut le faire comme documenté.
    Si vous postez un exemple de code, simplifiez le pour qu'on puisse reproduire le problème sans disposer de tous les équipements que vous avez.

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

  3. #3
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut
    Bonjour,

    je vous transmets mon code que je ne peux guère plus simplifier, en effet j'utilise Arduino avec et par conséquent je le retire ce dernier le code perd tout son sens....


    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
    import serial
    import numpy as np
    import matplotlib.pyplot as plt
    from drawnow import *
    import tkinter as tk
    from matplotlib.ticker import MultipleLocator, FormatStrFormatter
     
     
    app = tk.Tk()
     
     
    def launch_Graph():
        tempC = []
        arduino_Data = serial.Serial("com4",9600)
        plt.ion() #interactive mode (live data)
        cnt=0
        def makeFig():
            ay = plt.axes()
            ay.yaxis.set_major_locator(MultipleLocator(1))
            ay.yaxis.set_minor_locator(MultipleLocator(0.5))
            plt.ylim(0,30)
            plt.title("Temperature as function time")
            plt.grid(True)
            plt.ylabel("Temp (°C)")
            plt.xlabel("Time (s)")
            plt.plot(Data)
            """
            plt.plot(Data,"rx-",label="Degrees")
            plt.legend(loc="upper left")
            """
     
     
     
        while True:
            tempC.append(str(arduino_Data.readline()))
            def cleanData(L):
                newL = []
                for i in range(len(L)):
                    temp=L[i][2:]
                    newL.append(float(temp[:-5]))
                return newL
            Data = cleanData(tempC)
            drawnow(makeFig) # for draw the figure
            plt.pause(.000001)
            cnt+=1
            if(cnt>50):    # if there is 50 time the same value matplotlib set pause
                Data.pop(0)
     
    btn = tk.Button(app,command=launch_Graph).pack()
     
    app.mainloop()


    Ce code me permet de visualiser mes données en directe grâce à matplotlib cependant lorsque je j'introduis canvas le code ne marche plus que ce dernier reçoit continuellement des données..... Ainsi je ne sais pas comment faire
    pour intégrer mon graphique dans canvas.... Le lien que vous m'avez envoyer je le connais car je l'ai déjà utiliser pour faire des graphiques mais ces derniers ne recevaient pas de données en continu mais juste des données que j'avais
    rentré au préalable....

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 705
    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 705
    Par défaut
    Salut,

    Citation Envoyé par abcbbm Voir le message
    je vous transmets mon code que je ne peux guère plus simplifier, en effet j'utilise Arduino avec et par conséquent je le retire ce dernier le code perd tout son sens....
    Vous pouvez très bien remplacer l'Arduino par une fabrication de nombre aléatoires.

    Vous pourriez aussi mettre un "print" à la ligne 36 du code (qui ne fonctionne pas...) et constater que çà n'y arrive pas.

    Tenez un exemple (récupérer dans cette discussion et que je n'ai pas codé):


    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
    import tkinter as tk
    from random import randint
    from collections import deque
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
    from matplotlib.figure import Figure
    from matplotlib.animation import FuncAnimation
    from matplotlib import style
     
    SIZE = 10
    def ADC(dt):
     
        #vals= adc.read_adc(1, gain=GAIN) #Lecture ADC, test sans nbr aléatoire
        #valeurs.appendleft(vals)
     
        valeurs.appendleft(randint(1, 100)) #Géneration nombres aléatoire, test sans ADC
     
     
        moyenne = sum(valeurs) / len(valeurs)
        listbox.delete(0, tk.END)
        for val in valeurs:
            listbox.insert(tk.END, val)
        moyenne_texte.set("Moyenne : {:.2f}".format(moyenne))
        line.set_data(range(SIZE), valeurs)
     
     
     
    app = tk.Tk()
    app.wm_title("Lecture de valeurs en continu")
    valeurs = deque([0] * SIZE, maxlen=SIZE)
     
    moyenne_texte = tk.StringVar()
    moyenne_texte.set("Moyenne :")
    moyenne_label = tk.Label(app, textvariable=moyenne_texte, font=('', 16),
        fg="sea green")
    moyenne_label.grid(row=0, column=0, padx=5, pady=5)
     
    listbox = tk.Listbox(app)
    listbox.grid(row=1, column=0, sticky=tk.N+tk.EW, padx=5, pady=5)
     
    style.use("ggplot")
    fig = Figure(figsize=(8, 5), dpi=96)
    ax = fig.add_subplot(111)
    ax.set_xlim(0, SIZE)
    ax.set_ylim(0, 400)
    ax.set_xlabel("Temps (s)")
    ax.set_ylabel("Valeur (points)")
    line, = ax.plot(range(len(valeurs)), valeurs, 'b-o')
    fig.set_tight_layout(True)
     
    canvas = FigureCanvasTkAgg(fig, master=app)
    ## canvas.show()
    canvas.get_tk_widget().grid(row=0, column=1, rowspan=2, sticky=tk.NSEW)
     
    app.grid_columnconfigure(0, weight=1)
    app.grid_columnconfigure(1, weight=1)
    app.grid_rowconfigure(1, weight=1)
     
    anim = FuncAnimation(fig, ADC, interval=500)
    app.mainloop()
    Pas besoin d'Arduino pour générer des données.

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

Discussions similaires

  1. graphiques sans lien direct avec tables/requetes
    Par samtheh dans le forum VBA Access
    Réponses: 1
    Dernier message: 23/07/2007, 15h45
  2. Réponses: 1
    Dernier message: 02/02/2006, 10h11
  3. [Carte Graphique] Ecran Noir avec une Asus Extreme AX800/XL
    Par slowpoke dans le forum Composants
    Réponses: 2
    Dernier message: 06/10/2005, 18h45
  4. Empêcher l'accès direct avec squid
    Par Amélie Ladoque dans le forum Réseau
    Réponses: 6
    Dernier message: 11/04/2005, 14h49
  5. Ecrire directement avec une autre langue???
    Par touhami dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 21/02/2005, 21h57

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