簡體   English   中英

Matplotlib tkagg后端性能

[英]Matplotlib tkagg backend performance

我有一個可以繪制大量數據的tkinter應用程序,當畫布上有大量數據時,我注意到平移和縮放性能不佳。

查看tkagg_backend( 由此和其他幾個問題所建議),函數和文檔表明只有在用戶空閑時才應重繪畫布。 但是,從當前和以前的經驗來看,畫布一直在更新(重繪)mid zoom / pan。 因此,我正在研究所涉及的具體功能,並對此提出疑問。

dynamic_update函數:

def dynamic_update(self):
    'update drawing area only if idle'
    # legacy method; new method is canvas.draw_idle
    self.canvas.draw_idle()

canvas.draw_idle()函數:

def draw_idle(self):
    'update drawing area only if idle'
    if self._idle is False:
        return

    self._idle = False

    def idle_draw(*args):
        try:
            self.draw()
        finally:
            self._idle = True

    self._idle_callback = self._tkcanvas.after_idle(idle_draw)

._idle參數在后端初始化為True 這一點是我陷入困境的地方,因為我無法理解._idle是如何與鼠標活動相關聯的(我假設它是,如果那是錯的,請糾正我)。

有趣的是,畫布的行為就像我期望的那樣,通過注釋self.canvas.draw_idle()行(一旦鼠標按鈕被按下時重繪),從而不調用整個draw_idle函數。

因此,我的問題是如何設置_idle或為什么在我不idle時重繪整個畫布?

當引用“空閑”時,它不是用戶或他的鼠標活動,而是GUI主循環。 如果主循環當前不忙,則只應重繪畫布。 這里,當然self._idle只引用GUI的matplotlib部分,而draw_idle這個結構應該做的是防止畫布在繪制時被繪制。

平移或縮放時很容易發生這種情況。 鼠標移動到新位置,導致重新繪制。 當重繪正在進行時,鼠標已經進一步移動並導致下一次重繪。 在那個時間點,第一次重繪可能尚未完成,因此它將排隊。 等等,這樣在某些時候GUI可能會變得沒有響應。 為了防止這種情況,只有在前一個繪制完成后才會初始化新繪制,並且self._idle為true或false引導此行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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