matplotlib: comment actualiser la figure.toile

Je ne peux pas comprendre comment actualiser FigureCanvasWxAgg instance. Voici l'exemple:


import wx
import matplotlib
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.figure import Figure
class MainFrame(wx.Frame): 
def __init__(self): 
wx.Frame.__init__(self, None, wx.NewId(), "Main") 
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.figure = Figure(figsize=(1,2))
self.axe = self.figure.add_subplot(111)
self.figurecanvas = FigureCanvas(self, -1, self.figure)
self.buttonPlot = wx.Button(self, wx.NewId(), "Plot")
self.buttonClear = wx.Button(self, wx.NewId(), "Clear")
self.sizer.Add(self.figurecanvas, proportion=1, border=5, flag=wx.ALL | wx.EXPAND)
self.sizer.Add(self.buttonPlot, proportion=0, border=2, flag=wx.ALL)
self.sizer.Add(self.buttonClear, proportion=0, border=2, flag=wx.ALL)
self.SetSizer(self.sizer)
self.figurecanvas.Bind(wx.EVT_LEFT_DCLICK, self.on_dclick)
self.buttonPlot.Bind(wx.EVT_BUTTON, self.on_button_plot)
self.buttonClear.Bind(wx.EVT_BUTTON, self.on_button_clear)
self.subframe_opened = False
def on_dclick(self, evt):
self.subframe = SubFrame(self, self.figure)
self.subframe.Show(True)
self.subframe_opened = True
def on_button_plot(self, evt):
self.axe.plot(range(10), color='green')
self.figurecanvas.draw()
def on_button_clear(self, evt):
if self.subframe_opened:
self.subframe.Close()
self.figure.set_canvas(self.figurecanvas)
self.axe.clear()
self.figurecanvas.draw()
class SubFrame(wx.Frame): 
def __init__(self, parent, figure): 
wx.Frame.__init__(self, parent, wx.NewId(), "Sub")
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.figurecanvas = FigureCanvas(self, -1, figure)
self.sizer.Add(self.figurecanvas, proportion=1, border=5, flag=wx.ALL | wx.EXPAND)
self.SetSizer(self.sizer)
self.Bind(wx.EVT_CLOSE, self.on_close)
def on_close(self, evt):
self.GetParent().subframe_opened = False
evt.Skip()
class MyApp(wx.App):
def OnInit(self):
frame = MainFrame()
frame.Show(True)
self.SetTopWindow(frame)
return True
app = MyApp(0)
app.MainLoop()    

Je suis intéressé dans la séquence suivante d'opérations:

  • exécuter un script
  • redimensionner le cadre principal
  • appuyez sur la Parcelle bouton
  • double-cliquez sur la parcelle
  • appuyez sur le bouton Clear

Maintenant j'ai un mess sur le cadre principal de l'intrigue. Si je redimensionner le cadre, il retrace correctement. Ma question est que dois-je ajouter à mon code pour le faire sans redimensionnement?

Par un "gâchis", je veux dire quelque chose comme ceci:

http://img227.imageshack.us/img227/5407/mess.png

Merci d'avance.

Je ne suis pas sûr de ce que vous demandez, qu'entendez-vous par un "désordre"? J'ai essayé ton code et je ne vois pas de problèmes. Cadre principal redimensionne ok, bouton dessine intrigue, double-cliquez sur crée une nouvelle image montrant la même figure de la toile que le principal, le bouton clear efface l'intrigue et ferme la sous-trame.
Hmm.. c'est bizarre, j'ai ajouté la photo avec l'état après Claire.
J'ai d'abord essayé sur Linux, sous Windows, je peux reproduire votre photo. C'est parce que vous êtes le partage de votre chiffre d'objet entre les deux wxFrames (probablement pas une bonne idée). Si personne ne mise-moi, je vais regarder de plus près ce soir.
Merci, le partage de la figure est mon idée pour l'augmentation de la performance depuis je ne voudrais pas créer une nouvelle intrigue et de le faire une autre fois.

OriginalL'auteur Alex | 2010-03-14