我正在使用一个每秒发送 100 个读数的设备,我希望我的 GUI 有一个显示最后 300 个收集点的数据图。但是,我发现:
将新数据点附加到 y 轴队列
清除已经存在的情节
绘制新数据列表
重绘画布
在每个点之后需要将近 0.2 - 0.4 秒,这非常慢。
这是我目前使用的代码。while 循环不断检查队列,一旦有新元素被推送到队列中,它就会update
将该元素作为参数进行调用。任何人都可以提出一些提高效率的建议或 matplotlib 的替代方案吗?
class GraphFrame:
def __init__(self,root,channel,index):
self.root=root
self.frame=tk.Frame(self.root)
self.frame.pack(side=tk.LEFT)
self.y = Queue(maxsize = 300)
self.fig, self.axes = plt.subplots(1,1)
self.axes.plot(list(self.y.queue))
self.canvas = FigureCanvasTkAgg(self.fig, master=self.frame)
self.canvas.draw()
self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, padx=5, pady=5)
def update(self, new_point):
if self.y.full():
self.y.get()
self.y.put(new_point)
self.fig.axes[0].clear()
self.fig.axes[0].plot(list(self.y.queue))
self.canvas.draw()
Run Code Online (Sandbox Code Playgroud)
编辑:设法使用 blitting for matplotlib 解决了这个问题,并用带有图形图像的标签替换了 Tkinter 画布。将尝试在github上上传代码并链接它。