簡體   English   中英

tkinter開銷更新標簽文本

[英]tkinter overhead update label text

import tkinter as tk  
import time

class Example(tk.Toplevel):

    def __init__(self, root):
        tk.Toplevel.__init__(self, root)
        self.canvas = tk.Canvas(self, borderwidth=0, background="#ffffff")
        self.frame = tk.Frame(self.canvas, background="#ffffff")
        self.vsb = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.vsb.set)

        self.vsb.pack(side="right", fill="y")

        self.canvas.pack(side="left", fill="both", expand=True)
        self.canvas.create_window((4,4), window=self.frame, anchor="nw", 
                              tags="self.frame")

        self.frame.bind("<Configure>", self.onFrameConfigure)

        self.populate()

        self.l= tk.Label(self.frame, text= 1)
        self.l.grid()
        self.cb= tk.Button(self.frame, text= "asdf", command= self.cnt)
        self.cb.grid()
    def cnt(self):
        slowlist= []
        slow= 0
        for x in range(10000):
            now= time.time()
            self.l["text"]+=1
            end= time.time()
            if end-now >= 0.001:
                slow+=1
                slowlist.append(end-now)
        print (slow)
        print (slowlist[:5])

    def populate(self):
        '''Put in some fake data'''
        for row in range(100):
            tk.Label(self.frame, text="%s" % row, width=3, borderwidth="1", 
                 relief="solid").grid(row=row, column=0)
            t="this is the second column for row %s" %row
            tk.Label(self.frame, text=t).grid(row=row, column=1)

    def onFrameConfigure(self, event):
        '''Reset the scroll region to encompass the inner frame'''
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))

if __name__ == "__main__":
    root=tk.Tk()
    Example(root)
    root.mainloop()

上面是我的代碼,大部分代碼來自此文章 而且我擔心,當我使用self.l [“ text”] + = 1重復更新標簽文本時,在極少數情況下(大約10000個更新中有70個實例),大約需要0.11秒來更新標簽文本,而其余​​的迭代則快得多。

我想知道a)為什么在某些情況下更新會變得相當慢? 尤其是當在每次10000次迭代中大約有70個慢速情況似乎很穩定時,我想知道“恆定”時間漂移是否有任何原因。 b)在運行需要頻繁更新標簽文本的大型迭代循環時,如何避免這些慢速實例?

我仍然不確定開銷的原因以及如何解決它,但是這是減少影響的部分方法。

因此,我們知道在10000次連續運行中大約有70個慢速情況,我發現此結果實際上與執行的運行量成正比。 簡而言之,大約每執行140次tkLabelObject [“ text”] =“ value reassignment”,就會出現一個緩慢的執行過程,以至於需要0.01秒才能重新分配值並出現在GUI上(考慮一下其他139個執行時間已經過去無法在1xe-07的時間范圍內捕獲,0.01秒的執行速度明顯慢)。

因此,要減少這種影響,就要在每執行130次執行后立即休息一下。 因此,執行以下操作將可以避免在10000次更新tkLabel文本時出現“慢速情況”(好,示例代碼僅更新9100次,但是我們只需要在第一個for循環中更改范圍值即可進行調整)

import time

for x in range(70):

    time.sleep(0.0000000001) 

    for x in range(130):

        tkLabelObj["text"]= "value reassignment"

但是,這絕不是最佳實踐。 如前所述,我認為這只是解決更優雅的解決方案之前的一種方法。

暫無
暫無

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

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