如果我将一个 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()
我想可能是因为我逐行处理文件而不是将整个文件加载到 RAM 中。我试过 readlines() 但我得到了相同的结果。
最佳答案
很可能它正在计算换行符的去向,用于超过屏幕上当前可见区域的行。根据您给出的数字,每行平均超过 130 个字符;如果它们中的一些大大超出了这个范围,那么 Tkinter 就是众所周知的缓慢的情况。
您或许可以关闭自动换行(通过使用 wrap=NONE
配置文本),这可能需要您添加一个水平滚动条。如果这是 Not Acceptable ,那么添加您自己的换行符可能会有所帮助,前提是有一些自然点可以将它们插入到您的数据中。
请注意,''.join(f)
是一种相当低效的将整个文件读入单个字符串的方法 - 只需使用 f.read()
.
关于python-3.x - 从文件插入文本后的 Tkinter CPU 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44640747/