tkinter头顶更新标签tex

2024-09-30 18:34:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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()

上面是我的代码,大部分代码来自this post。我担心的是,当我使用self.l[“text”]+=1重复更新标签文本时,会有很少的情况(10000次更新中大约有70次)更新标签文本大约需要0.11秒,而其余的迭代会更快。你知道吗

我想知道a)为什么会有更新变得相当慢的情况?特别是当每次10000次迭代中大约有70个慢用例的时候,我想知道是否有什么原因导致这种“恒定”的时间漂移。b)在运行需要经常更新标签文本的大型迭代循环时,如何避免这些缓慢的实例?你知道吗


Tags: textselffortimedefrootframelabel
1条回答
网友
1楼 · 发布于 2024-09-30 18:34:45

我仍然不确定开销的原因以及如何解决它,但是这里有一个减少影响的部分方法。你知道吗

所以我们知道,在10000次连续运行中,大约有70次运行缓慢,我发现这个结果实际上与执行的运行量成正比。简单地说,tkLabelObject[“text”]=“value reassignment”每执行140次,就会出现一次缓慢的执行,这样重新分配值需要0.01秒,并显示在GUI上(考虑到在1xe-07时间段内无法捕获其他139次执行的时间,0.01秒的执行速度非常缓慢)。你知道吗

因此,要减少这种影响,就要在大约每执行130次死刑后,就叫停一段时间。因此,执行以下操作可以避免10000次更新tkLabel文本时出现“慢情况”(好吧,示例代码只更新9100次,但我们只需要更改第一个for循环中的range值即可进行调整)

import time

for x in range(70):

    time.sleep(0.0000000001) 

    for x in range(130):

        tkLabelObj["text"]= "value reassignment"

但是,这绝不是最好的做法。正如前面所说的,我认为这只是一种方法,直到出现更优雅的解决方案。你知道吗

相关问题 更多 >