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 :

Matplotlib - canvas refresh [Python 2.X]


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut Matplotlib - canvas refresh
    Bonjour,

    J'ai un soucis avec le rafraîchissement d'une figure dans un canvas tkinter. Je sens qu'il ne me manque trois fois rien, mais j'ai beau chercher je ne vois pas... Voici un petit code exemple:
    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    try:
        import tkinter as tk
    except ImportError:
        import Tkinter as tk
     
    import matplotlib.pyplot as plt
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
     
    import random
    import numpy as np
     
    def create_fig():
        fig = plt.figure()
        ax = fig.add_subplot(111)
        xs = np.arange(0,10,1)
        ys = np.array([random.random() for x in xs])
        ax.scatter(xs, ys, color='red')
        return fig
     
    class MainApp(tk.Frame):
        def __init__(self, master, *args, **kwargs):
            tk.Frame.__init__(self, master, *args, **kwargs)
            self.master = master
            self._initialize()
     
        def _initialize(self):
            # Place a figure
            fig = create_fig()
            self.fig = fig
            self.canvas = FigureCanvasTkAgg(self.fig, master=self)
            self.canvas.get_tk_widget().config(height=400)
            self.canvas.get_tk_widget().pack(fill='both', expand=1, padx=1, pady=1)
            self.canvas.draw()  # <-- No impact when commented
     
            # Place a button
            b = tk.Button(self, text="START", command=self.run)
            b.pack(fill='both', expand=1, padx=1, pady=1)
     
        def run(self):
            self.fig.clear()
            self.fig = create_fig()
            self.canvas.draw()
     
    if __name__ == '__main__':
        root = tk.Tk()
        root.resizable(0,0) 
        MainApp(root).pack()
        root.mainloop()
    Je créé un figure que je place dans un canvas. Lorsqu'on clique sur un boutton, une fonction génère une nouvelle figure. Je souhaite mettre à jour le canvas avec cette nouvelle figure. Actuellement, la figure précédente est effacée, la nouvelle figure est générée, mais canvas.draw() semble inopérant. Le canvas reste désespérément vide...

    Je sens que c'est pas grand chose. Y'a bien la solution donnée ICI mais c'est un peu bourrin, surtout que j'avais déjà réussi à rafraichir une figure par le passé, mais pas conservé le code.

    Ciao

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Par défaut
    Salut Julien,
    Passe en mode interactif pour utiliser draw (matplotlib.pyplot.ion).
    Tu crées plusieurs Figure, dans _initialise et dans run. Pas sûr que c'est ce que tu veux faire.

  3. #3
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Salut.

    Merci beaucoup pour ta réponse. En regardant l'aide sur ion() (que je ne connaissais pas) j'ai compris que cela permet d'updater au fur et à mesure une figure. Et là ça a fait tilt. Je n'ai pas besoin de créer une nouvelle 'figure', mais juste effacer son contenu et tracer quelque chose d'autre dedans. En somme je peux passer à 'create_figure()' une figure comme parametre. Comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def create_fig(fig):
        fig.clear()
        ax = fig.add_subplot(111)
        xs = np.arange(0,10,1)
        ys = np.array([random.random() for x in xs])
        ax.scatter(xs, ys, color='red')
        return fig
    Dans _initialize() je créé une figure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.fig = plt.figure
    self.fig = create_fig(self.fig)
    Et la method run:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def run(self):
        self.fig = create_fig(self.fig)
        self.canvas.draw()
    Et cela fonctionne. Après c'est peut-être pas très propre de modifier un attribut via une fonction. Je suis ouvert à d'autres architectures.

    Merci, je passe en résolu.

    Ju

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 2.X] thread, matplotlib, tk canvas
    Par JoeDalton dans le forum Tkinter
    Réponses: 4
    Dernier message: 18/06/2014, 09h50
  2. auto refresh d'un canvas
    Par goku19 dans le forum Silverlight
    Réponses: 2
    Dernier message: 06/03/2012, 15h53
  3. Réponses: 4
    Dernier message: 15/02/2009, 11h22
  4. Réponses: 6
    Dernier message: 18/12/2007, 10h42
  5. lors d'un refresh le canvas se vide
    Par dietrich dans le forum Delphi
    Réponses: 3
    Dernier message: 12/12/2006, 13h43

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