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.
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
Vous devez vous connecter pour publier un commentaire.
Comme je l'ai dit dans les commentaires, je ne pense pas que la figure de la toile d'actualisation est votre problème, en fait je pense qu'il est en train de faire exactement ce qu'il est censé (redessiner lui-même basé sur le dernier état [ie que c'était dans votre intrigue secondaire]). Je pense que votre problème est plus que la wxFrame n'est pas rafraîchissant.
La façon la plus facile de le corriger, ce serait le faire redimensionner sur votre "Clair" de l'événement. Quelque chose comme:
La taille de l'ensemble serait la cause de la trame et de tous les contrôles qu'il contient à être redessinée.
Cela dit, je pense que le partage de votre figure entre les deux figurecanvas est dangereux. J'ai été en mesure de produire des erreurs graves en cliquant/redimensionnement de choses dans différentes combinaisons. À l'occasion de votre chiffre serait ordures collectées lorsque le châssis a été fermé, ce qui rend indisponible pour votre cadre principal.
self.axe.clear()
est très lent! J'ai mon application, j'ai besoin de complot pour beaucoup de temps,self.axe.clear()
vais accrocher mon application pour 0,5 s 🙁OriginalL'auteur Mark