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:
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