簡體   English   中英

Tkinter matplotlib canvas 對於實時數據更新太慢

[英]Tkinter matplotlib canvas updates too slowly for real time data

我正在使用每秒發送 100 個讀數的設備,並且我希望我的 GUI 具有此數據的 plot,顯示最后收集的 300 個點。 但是,我發現:

  1. 將新數據點附加到 y 軸隊列

  2. 清除已經存在的 plot

  3. 繪制新數據列表

  4. 重繪 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM