python - 在 Python 中显示大量格式化文本

标签 python performance richtextbox tkinter

我有两个大小相同的大文件。一种是 ASCII 纯文本,另一种是彩色编码覆盖,对应文件中每个文本字符一个字节。

这些文件可能很大 - 高达 2.5 MB;可能更多,可能超过 100MB。

我要显示的文本是一个可滚动的文本查看器,使用第二个文件作为覆盖。看起来像这样:

Tkinter Text window with tagged text for colours http://img713.imageshack.us/img713/2584/statsviewer01d.png

所以我用 Python 制作了一个带有滚动条等的简单 tkinter 文本小部件窗口。

我的代码是这样的:

hottest = 0
for heat in heatmap:
    hottest = max(hottest,ord(heat))
hottest += 1
for heat in xrange(0,hottest):
    factor = int((float(heat)/float(hottest))*100.0)
    # an observation; tkinter seems to normalise custom colours
    # to nearest in it's palette, which means I can't use custom
    # gradients of red; if anyone knows how to use subtle custom colours?
    bgcolour = "gray%d" % (100-factor)
    fgcolour = "gray%d" % factor
    text.tag_config("n%d"%heat,background=bgcolour,foreground=fgcolour)
text.insert("1.0",f.read())
ofs = 0
for heat in heatmap:
    if 0 != ord(heat):
        coord_start = "1.0 + %d chars"%ofs
        coord_stop = "1.0 + %d chars"%(ofs+1)
        text.tag_add("n%d"%ord(heat),coord_start,coord_stop)
    ofs += 1
text.config(state=DISABLED)
text.focus()

但是,我遇到了可怕的性能问题:

  1. 加载文本

    • 如果我简单地使用 textwidget.text = textfile.read() 它会立即加载,即使对于大文件也是如此;但问题是对它进行颜色编码。 (见上面的代码)。要添加标签,一次一个字符,似乎我强制它使用 painter algorithm ;当文件大小约为 300KB 时,我放弃等待它加载
    • 如果我从文本文件和颜色文件中读取下一个字符,并附加一个正确标记的字符,则需要很长时间;一个大于 200KB 的文件,我放弃等待它加载
  2. 滚动。如果在当前窗口中可见这么多格式,则显示速度非常慢

如果我在 Dephi 或 wxWidgets 或其他软件中解决这个问题,我会使用自定义绘制的控件。

Python 和 Tkinter 中最直接的方法是什么?

最佳答案

如何使用可滚动的 Canvas ,只绘制用户显示的文本/热图?无论文件大小如何,这都可以让您快速进行初始绘制并在内容移动时快速重绘。

如果你想要更快的速度和更多的控制,那么你需要某种虚拟 Canvas ,其中只有显示区域和它周围的区域实际存在,其他任何东西都只在它被引用时绘制。我不认为 TkInter 会给你那么多的控制权,尽管 Widget Construction Kit (WCK) 之类的东西应该可以。

关于python - 在 Python 中显示大量格式化文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2279063/

相关文章:

c# - 改变选择的RTF

C# FlowDocument 到 HTML 的转换

python - 如何删除ipython交互窗口中的错误单元格?

python - 从找到的极值中获取完整行数据

sql-server - 这是 "correct"数据库设计吗?

c# - 比 String.Replace() 更快

c - 如何测量从用户那里获取输入的二进制文件的准确性能(执行时间)

python - 在 spark 中过滤数据帧使用 "in a set"子句

python - 学习 Django - 很好的入门项目