2010-02-17 41 views
6

我有两个大的相同大小的文件。一个是ASCII纯文本,另一个是彩色编码叠加层,相应文件中每个文本字符一个字节。在Python中显示大量的格式化文本

这些文件可以很大 - 高达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大小的时候,我放弃等待它加载
    • ,如果我读文本文件和colourfile下一个字符,并追加一个正确标记字符,它永远;一个大于200KB的文件,我放弃等待它加载
  2. 滚动。如果这么多当前窗口格式可见,它会非常缓慢

如果我逼近,比如,Delphi的或wxWidgets的或什么这个问题,我有一个自定义绘制控件。

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

+1

考虑停止使用Tkinter。我不知道你问的是否可能,但Tkinter有很多限制,并且通常过于复杂。 – nosklo 2010-02-17 10:56:06

+0

@nosklo:如果您有其他建议的替代方案,请将其作为答案发布,以便我们可以对其进行修改。 – 2010-02-17 10:57:09

+0

@nosklo:有什么选择?便携式,免费的,有据可查的,容易的,...? – Will 2010-02-17 11:12:48

回答

3

如何使用可滚动画布代替,并且只绘制用户公开的文本/热图?无论文件的大小如何,当事情四处移动时,这应该会给你一个快速的初始绘制和快速重绘。

如果你想更快的速度和更多的控制,那么你就需要某种形式的虚拟画布只有在显示面积和各地实际存在的区域,别的只画成,当它被引用的。虽然像Widget Construction Kit(WCK)应该这样做,但我认为TkInter不会给你太多的控制权。

+0

[显示大量数据](http://effbot.org/zone/wck-4.htm) – wwii 2016-12-15 21:56:30