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

时间:2010-02-17 07:46:30

标签: 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 Text小部件窗口。

我的代码如下所示:

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时,我放弃等待它加载
    • 如果我从文本文件和colourfile中读取下一个字符,并附加一个正确标记的字符,则需要永久;一个大于200KB的文件,我放弃等待它加载
  2. 滚动。如果在当前窗口中显示这么多格式,那就非常慢了

  3. 如果我在Dephi或wxWidgets或其他任何地方接近这个问题,我会有一个自定义控件。

    Python和Tkinter中最简单的方法是什么?

1 个答案:

答案 0 :(得分:3)

如何使用可滚动画布,并且只绘制用户公开的文本/热图?无论文件大小如何,这都可以让你快速初步绘制并快速重绘。

如果你想要更高的速度和更多的控制,那么你需要某种虚拟画布,其中只有显示的区域和它周围的区域实际存在,其他任何东西只在被引用时被绘制。我不认为TkInter会给你那么多的控制权,虽然像Widget Construction Kit(WCK)这样的东西应该这样做。