2017-06-19 43 views
3

如果我使用25MB/190,000行文本文件并将其转储到文本小部件中,该过程可以快速完成,但是之后我仍然可以看到使用50%CPU的python.exe。文件越大,CPU使用率降至0%所用的时间就越长。当我开始将多个文件加载到不同的文本小部件中时,它们会立即加载到小部件中,但CPU保持在50%,并且GUI运行非常缓慢,直到它完成在后端执行的任何操作。有人可以向我解释为什么CPU仍在使用中,以及为什么它会影响性能,如果文本已经在widget中?它需要做什么?任何方式在这个?从文件中插入文本后的Tkinter 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(),但我得到了相同的结果。

回答

4

最有可能的是它计算出换行符的位置,对于当前屏幕上可见区域的行。用你给出的数字,这些行的平均长度超过130个字符;如果他们中的一些已经大大超过了这一点,这就是Tkinter已知缓慢的情况。

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

请注意,''.join(f)是一个相当低效的方式来读取整个文件成一个字符串 - 只需使用f.read()

+0

转向文字包装关闭转了1分20秒到19秒。这将有助于TON。随意分享任何其他想法。 – sidnical

+0

我使用笔记本来加载带有很多不同文本文件的标签。当加载它们的很多时候,它在GUI再次可用之前一直要花费很长时间。现在不到一分钟。这一变化造成了一个荒谬的区别。 – sidnical

相关问题