【发布时间】:2020-10-31 11:23:30
【问题描述】:
我正在使用每秒发送 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()
编辑:设法解决了这个问题,使用 matplotlib 的 blitting 并将 Tkinter 画布替换为带有图形图像的标签。将尝试在github上上传代码并链接它。
【问题讨论】:
-
你应该修改线条艺术家,而不是清除图形并从头开始构建。
-
你能发一份代表数据的清单吗?也许像 15 - 25 个数据点?
-
Queue是从哪里导入的? -
@PaulH 数据点只是来自传感器的浮点读数。当没有人在它前面时,值约为 2000,当有人站在它前面时,值约为 20,000。浮点数没什么特别的。
-
@PaulH
from queue import Queue
标签: python matplotlib tkinter real-time