57 lines
1.5 KiB
Python
57 lines
1.5 KiB
Python
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 save(self, filename):
|
|
self.figure.savefig(filename)
|
|
|
|
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()
|