added a Matplolib Plotter for async data

This commit is contained in:
Patrick 2024-07-06 18:19:11 +02:00
parent 9302f359bf
commit b10f09c3e0
1 changed files with 53 additions and 0 deletions

53
Plotter.py Normal file
View File

@ -0,0 +1,53 @@
import queue
import threading
import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
class Plotter(tk.Frame):
def __init__(self, root, percent_lim: bool = False):
super().__init__(root)
self.figure = Figure(figsize=(8, 8))
self.axes = self.figure.add_subplot()
self.canvas = FigureCanvasTkAgg(self.figure, master=self)
self.canvas.get_tk_widget().pack()
self.__queue = queue.Queue()
self.data = {}
self.percent_lim = percent_lim
self.master.after(1000, self.__update)
def append(self, name: str, value):
self.__queue.put((name, value))
def __update(self):
to_update = False
while not self.__queue.empty():
to_update = True
name, value = self.__queue.get()
if name in self.data:
self.data[name].append(value)
else:
self.data[name] = [value]
if to_update:
self.__update_plot()
self.master.after(1000, self.__update)
def __update_plot(self):
self.axes.cla()
if self.percent_lim:
self.axes.set_ylim(0, 1)
self.axes.set_xlim(left=0, auto=True)
for (name, values) in self.data.items():
self.axes.plot(values, label=name)
self.axes.legend()
self.canvas.draw()