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()