2010-04-28 9 views
0

J'ai un problème avec matplotlib où il trace seulement une ligne la première fois que j'ai exécuté la fonction draw() que j'ai faite pour cela. Mon code est comme ceci:parcelles de matplotlib une fois seulement

Je graphPanel.py: (dépouillé à l'essentiel)

class GraphPanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 

     self.figure = Figure() 
     self.canvas = FigureCanvasWxAgg(self, -1, self.figure) 

     self.draw() 

    def draw(self, curves={}):  #This creates the axis and 
     if not hasattr(self, "ax"): #plots all the lines in the curve dictionary 
      self.ax = self.figure.add_subplot(111) 

     self.ax.lines = [] 

     for name, props in zip(curves.keys(), curves.values()): 
      x, y, col = props 
      line = self.ax.plot(x, y, color=col, lw=3) 

Et le fichier Main.py qui contient toute l'interface où le graphpanel est intégré, ainsi que d'une fonction cela devrait appeler la fonction draw() du panneau, en lui donnant un dictionnaire contenant un ensemble de courbes. Le problème est, quand je fais cela, il ignorera complètement la liste self.ax.lines étant vidé et l'appel plot() et laisser tout comme il était auparavant.

Pour une raison quelconque, il ne fonctionne que la première fois que je l'appelle, de la initialisation de la classe, parce que si je mets un dictionnaire avec des points dans l'appel draw() placé dans il initialisation les tracer parfaitement.

Pourquoi ça ne marche pas si j'appelle draw() une autre fois?

Répondre

2

a la fin de vous propre méthode draw() vous devez appeler

self.canvas.draw() 

dire la toile, il doit mettre à jour l'écran en ce moment. Sinon, il fera donc sur l'événement de tirage suivant (que vous causez par ce hack terrible que vous avez mentionné)

-1

Pour les personnes avec mon même problème

Je l'ai résolu avec un peu de « pirater »

J'ai fait une fonction dans la fenêtre principale qui détruit la graphpanel, supprime sa valeur (del graphpanel) puis crée un nouveau, en lui envoyant un dictionnaire avec les données de la courbe aussi. Puis je "secoue" les fenêtres (j'ai fait une autre fonction qui augmente sa taille de 1px et la ramène à la normale, pour forcer un evt_size event) à redimensionner le graphpanel (ou bien ce serait un petit carré en haut de la fenêtre.

Questions connexes