python-3.x - 从文件插入文本后的 Tkinter CPU 事件

标签 python-3.x tkinter

如果我将一个 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/

相关文章:

django - 当我将我的 Django 应用程序从一个系统复制到另一个系统时,如何确定要安装哪些依赖项?

python - 为什么在mac上使用PyQt5不能添加图标?

python - 如何在 Tkinter 文本框上设置对齐方式

python - 在QT设计中打开*.py文件 "created initially by Tkinter"并将其转换为*.ui

Python:从命令行运行时包含库文件夹

python - 使用错误的输入类型调用函数时打印 "Wrong Type"- Python

python - 在Tkinter中尝试约会-Python

python - 如何避免 tkinter <<ListboxSelect>> 和 .curselection() 在列表框之外检测事件/选择?

python - Mypy:我应该如何键入一个以字符串作为键并且值可以是字符串或字符串列表的字典?

python-3.x - Mac OS 10.14.6更新后Tkinter使计算机崩溃