如何在python中的Tkinter文本小部件中优化标记的单词?

时间:2019-01-29 22:41:08

标签: python tkinter tags

我正在python 3.6中使用TKinter文本小部件,以用一些元数据标记每个单词。我发现一旦我有800多个单词,该程序就会开始非常缓慢地运行,并在3200时几乎没有响应。我想知道是否有优化我的代码的方法,以便它可以处理更多带标签的单词?或者,如果有帮助,请提供小部件访问更多内存的权限。

这是我程序的非常简化的版本:


import tkinter as tk
from tkinter.scrolledtext import ScrolledText

def createWidgets(root):
    textcanvas = ScrolledText(root, insertofftime=0) 
    textcanvas.pack()
    populate(textcanvas)
    return textcanvas

def populate(textcanvas):
    for i in range(5000):
        textcanvas.insert(tk.END, "word ", "TAG:>{:d}".format(i))


if __name__ == '__main__':
    root =tk.Tk()
    createWidgets(root)
    root.mainloop()

1 个答案:

答案 0 :(得分:0)

通常来说,文本小部件应该能够处理数千个标签,而不会对性能造成很大的影响。但是,数据的某些特征可能会影响这一点。

根据您的示例,数据具有会导致性能下降的特征之一:您将插入25,000个带有5,000个标签的字符,而所有字符都没有换行符。

这是canonical text widget documentation关于性能注意事项(强调强调您可能会看到的问题)的意思:

  

文本小部件应在各种条件下有效运行。文本小部件为每个文本字节使用大约2-3个字节的主内存,因此在大多数工作站上,包含兆字节或更多字节的文本应该是实用的。文本在内部用修改的B树结构表示,即使使用大文本也可以使操作相对高效。标签包含在B树结构中的方式允许标签跨越较大范围或具有许多不相交的较小范围而不会降低效率。标记也以允许大量标记的方式实现。在大多数情况下,可以使用大量唯一标签或具有许多不同范围的标签。

     

如果您有成百上千个具有以下特征的不同标签,则可能会出现性能问题:每个标签的第一个和最后一个范围分别位于文本的开头和结尾附近,或者单个标签范围覆盖大多数文本小部件。像这样添加和删除标签的成本与具有相同属性的其他标签的数量成正比。相反,如果将数千个不同的标签的整体范围定位并均匀地分布在整个文本中,则没有问题。

     

非常长的文本行可能会很昂贵,尤其是其中有很多标记和标签的情况。

     

每次光标闪烁时,都会重新绘制带有插入光标的显示行,这将导致源源不断的图形流量。避免将insertOffTime属性设置为0。