代码之家  ›  专栏  ›  技术社区  ›  Will

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

  •  6
  • Will  · 技术社区  · 14 年前

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

    这些文件可以是大的-高达2.5 MB;可能更大,可能超过100 MB。

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

    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=text file.read(),它会立即加载,即使对于大文件也是如此;但问题是颜色编码。 (见以上代码) . 为了添加标签,一次添加一个字符,似乎我强迫它 painter algorithm ;当文件大小约为300KB时,我放弃等待加载
      • 如果我从文本文件和颜色文件中读取下一个字符,并附加一个正确标记的字符,那么这需要永远;一个大于200kb的文件,我放弃等待它加载。
    2. 滚动。如果在当前窗口中看到如此多的格式,则速度非常慢

    如果我在DEPHI或WXWidgets等工具中处理这个问题,我将有一个自定义的绘制控件。

    在python和tkinter中,最直接的方法是什么?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Anonymous Custard    14 年前

    不如使用可滚动画布,只绘制用户公开的文本/热图?无论文件的大小如何,这样可以在移动时快速绘制初始图形和快速重绘。

    如果你想要更高的速度和更大的控制力,那么你需要某种虚拟画布,其中只有显示的区域和它周围的区域是实际存在的,任何其他的东西都只能在被引用时绘制出来。我认为Tkinter并没有给你那么多的控制权,尽管像widget构建工具包(wck)这样的东西应该可以做到。