ich habe folgendes Problem:
Ich möchte analoge Werte von einer analogen Box(Gantner A5) lesen und grafisch darstellen. Diese Werte sollen dann grafisch dargestellt werden. Also es soll ein Graph in "Echtzeit" gezeichnet werden.
Soweit so gut.
Ich habe die Kommunikation über eine rs485 Verbindung realisiert. Auch die Werte lassen sich grafisch darstellen und es funktioniert soweit.
Jetzt kommt das "Problem": Sobald ich ein paar Buttons einfüge um das Event zu starten (siehe Code: thread_f), bzw. zu stoppen, oder anzuhalten, funktioniert das zeichnen nicht mehr. Und ich kann mir nicht erklären wieso.
Hier einmal der Code:
Code: Alles auswählen
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation
from matplotlib.widgets import Button
from threading import Thread
class ZeichneGraph:
def __init__(self): #konstruktor
self.x_data, self.y_data = [], []
self.m_figure = plt.figure()
self.line, = plt.plot(self.x_data, self.y_data)
self.animation = FuncAnimation(self.m_figure, self.update, interval=500)
def update(self, frame):
if(len(self.x_data)==len(self.y_data)): # manchmal passiert es, dass der Thread den Wert zu früh schickt -> Fehler-> daher len vgl.
self.line.set_data(self.x_data, self.y_data)
self.m_figure.gca().relim()
self.m_figure.gca().autoscale_view()
return self.line,
def show(self):
plt.show()
def thread_f(self): # füllt durch Thread Daten in die Container
x = 0
while True:
self.x_data.append(x)
x += 1
self.y_data.append(get_Data_from_A5(ser,0)) # hole Daten von Analogbox / anstatt dieser Werte können auch einfach rnd. Werte erzeut werden
time.sleep(1)
def thrd_start(self, event):
self.th = Thread(target=self.thread_f, daemon=True)
self.th.start()
def b_test(self,k1,k2,k3,k4,name):
m_funk = Button(plt.axes([k1, k2, k3, k4]), name)
return m_funk
g = ZeichneGraph()
start = g.b_test(0.8, 0.01, 0.1, 0.04,'Start')
start.on_clicked(g.thrd_start)
g.show()
Ich hatte davor den Thread im Konstruktor gestartet. Damit hat das super funktioniert.
Code: Alles auswählen
def __init__(self): #konstruktor
self.x_data, self.y_data = [], []
self.m_figure = plt.figure()
self.line, = plt.plot(self.x_data, self.y_data)
self.animation = FuncAnimation(self.m_figure, self.update, interval=500)
self.th = Thread(target=self.thread_f, daemon=True)
self.th.start()
Die Funktion:
Code: Alles auswählen
def b_test(self,k1,k2,k3,k4,name):
m_funk = Button(plt.axes([k1, k2, k3, k4]), name)
return m_funk
Kann mir hier wer helfen?