Bonsoir,
j'écris un programme qui récupère des data et les affiche plus ou moins en temps réel sur un graphe Matplotlib dans un contexte d'interface tkinter. J'ai des problèmes de performance (l'affichage + processing rend l'interface presque inutilisable, la event-loop semble presque toujours bloquée).
Du coup je veux mettre le processing +graphe dans un thread. Le processing est actuellement mis sous forme de thread et cela fonctionne, mon interface est à nouveau réactive. Mon thread est une boucle infinie avec court un "sleep" au milieu. La fin de la boucle infinie lance la fonction ci-dessous :
L'objet est un objet "App" Tout fonctionne tant que je ne décomente pas la derniere ligne self.canvas.draw() : sans cette ligne j'ai des résultats de mon processing qui sont les bons. Avec cette ligne, l'application freeze. Notez que le meme code fonctionnait avant d'etre mis sous forme de thread.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 def updateGraph(self): self.ax.cla() if hasattr(self, 'data'): self.ax.plot(self.time, self.data,'-',color='blue') self.ax.plot(self.time, self.consigne,'-',color='red') minVal =np.amin(self.time) else: minVal = 0 self.ax.set_xlabel("Temps (s)") self.ax.set_ylabel("Vitesse (rd/s)") self.ax.set_xlim(left=minVal, right=minVal+self.maxNbPoints*self.deltaTime) self.ax.set_ylim(bottom=-0.1, top=5.1) # self.canvas.draw()
Le graphe lui meme est créé dans le constructeur de mon objet de la façon suivante :
Je pense que ce serait mieux si au lieu d'invoquer canvas.draw() je pouvais envoyer un message à la event_loop pour qu'elle fasse le rafraichissement quand elle peut, mais je n'ai pas trouvé comment faire cela (je débute en python).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 self.fig = mplfig.Figure(figsize=(6, 4)) #create figure object self.ax = self.fig.add_axes([0.125, 0.125, 0.75, 0.75]) #define axes self.canvas = tkagg.FigureCanvasTkAgg(self.fig, master=master) #encapsulate figure in tkinter canvas self.canvas.get_tk_widget().pack(fill=tk.BOTH, expand=1)
Mon environnement est anaconda, téléchargé avant hier (jour de mes premiers pas émus en python).
Avez-vous une idée de ce qui peut se passer ?
Merci !
Partager