[英]Tkinter matplotlib canvas updates too slowly for real time data
我正在使用每秒發送 100 個讀數的設備,並且我希望我的 GUI 具有此數據的 plot,顯示最后收集的 300 個點。 但是,我發現:
將新數據點附加到 y 軸隊列
清除已經存在的 plot
繪制新數據列表
重繪 canvas
每個點之后需要將近 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 canvas 替換為 ZD304BA20E96D80E344Z5 的 8 個圖像的問題。 將嘗試在 github 上上傳代碼並鏈接它。
我不會為每個新點重建您的圖形,而是修改您已有的 LineArtist。
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)
# capture the artist
self.line, = 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)
# update the artist
self.line.set_xdata(list(range(len(self.y))))
self.line.set_ydata(list(self.y.queue))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.