从文件插入文本后 Tkinter CPU 活动

sid*_*cal 3 tkinter python-3.x

如果我将一个 25MB/190,000 行的文本文件转储到一个文本小部件中,该过程会很快完成,但之后我仍然看到 python.exe 使用 50% CPU 一分钟左右。文件越大,CPU 使用率下降到 0% 所需的时间就越长。当我开始将多个文件加载到不同的文本小部件中时,它们会立即加载到小部件中,但 CPU 保持在 50% 并且 GUI 运行得非常慢,直到它在后端完成任何操作。有人可以向我解释为什么 CPU 仍在使用中,如果文本已经在小部件中,为什么它会影响性能?它需要做什么?有什么办法解决这个问题吗?

from tkinter import *


file = r"C:\path\to\large\file.txt"

def doit():
    with open(file, 'r') as f:
        txt.insert('end', ''.join(f))
        f.close()
main = Tk()

txt = Text(main)
txt.grid(row=0)

btn = Button(main, text="click here", command=doit)
btn.grid(row=1, columnspan=2)

main.mainloop()
Run Code Online (Sandbox Code Playgroud)

我想可能是因为我逐行处理文件而不是将整个文件加载到 RAM 中。我试过 readlines() 但我得到了相同的结果。

jas*_*per 5

很可能它正在计算换行符的位置,对于经过屏幕上当前可见区域的行。根据您提供的数字,每行平均长度超过 130 个字符;如果他们中的一些人大大超过了这一点,那么 Tkinter 就在这种情况下进展缓慢。

您也许可以关闭自动换行(通过使用 配置文本wrap=NONE),这可能需要您添加水平滚动条。如果这是不可接受的,那么添加您自己的换行符可能会有所帮助,如果有一些自然的点可以将它们插入到您的数据中。

请注意,''.join(f)将整个文件读入单个字符串是一种相当低效的方法 - 仅用于此目的f.read()