so ... Ich habe versucht, kivy zu erhalten, um Daten in Echtzeit erstellt, mit Matplotlib. Ich habe in TkInter schon einen ähnlichen Code benutzt und es funktionierte wie ein Zauber, also bin ich wirklich verwirrt, warum es hier nicht funktioniert.Echtzeit-Plotten mit Matplotlib und Kivy in Python
Hier ist der Code:
import numpy as np
import matplotlib
matplotlib.use('module://kivy.garden.matplotlib.backend_kivy')
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
import matplotlib.pyplot as plt
class MyApp(App):
def build(self):
box = BoxLayout()
self.fig,self.ax = plt.subplots(1)
self.plt_canvas = self.fig.canvas
box.add_widget(self.plt_canvas)
self.line = self.ax.plot([])[0]
self.i = 0
plt.show()
Clock.schedule_interval(self.update, 1)
return box
def update(self, *args):
self.line.set_xdata(np.arange(self.i))
self.line.set_ydata(np.arange(self.i))
self.i +=1
plt.draw()
MyApp().run()
ich es haben wollte, die Linie zu zeichnen, 1 Punkt pro Sekunde. Aber anstatt das ich bekommen:
scheint, wie die Leinwand neu zu zeichnen ist nicht. Was mache ich falsch?
ich keine Ahnung, was auch immer über Kivy haben. Aber was ich sagen kann, ist, dass wenn Sie Tkinter mit einem eingebetteten Plot verwenden, Sie 'plt.draw()' nicht verwenden würden, um ein Plot zu aktualisieren. Eher würden Sie 'self.plt_canvas.draw_idle()' nennen. Also, als du gesagt hast, dass es vorher mit Tkinter funktionierte, hast du den Plot tatsächlich in irgendeine GUI eingebettet oder hast du einfach alle pyplot Methoden aus einer Klasse wie hier aufgerufen? Ich könnte mir gut vorstellen, dass das verwendete kivy-Backend gar nicht "plt.draw()" erlaubt. – ImportanceOfBeingErnest
Mit der Aussage, es funktionierte, bevor ich meinte, dass der Aufruf der Methode mit Scheduler und die Verwendung von 'self.line.set_xdata()' funktionierte. Natürlich musste der Code editiert werden, um mit kivy zu arbeiten. Aber nach offiziellen [Beispiel] (https://github.com/kivy-garden/garden.matplotlib/blob/master/examples/test_plt.py) gibt es keine Probleme mit 'plt.draw()'. –