我有两个大的相同大小的文件。一个是ASCII纯文本,另一个是彩色编码叠加层,相应文件中每个文本字符一个字节。在Python中显示大量的格式化文本
这些文件可以很大 - 高达2.5 MB;可能会更多,也许超过100MB以后。
我想显示的文本是一个可滚动的文本查看器,使用第二个文件作为覆盖。看起来像这样:
所以我在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()
不过,我遇到可怕的性能问题:
加载文本
- 如果我只是使用textwidget.text = textfile.read()会立即加载,即使是大文件也是如此。但是接下来的问题是对它进行颜色编码。 (见上面的代码)。要添加标签,一次一个字符,似乎我强迫它采取painter algorithm;通过档约300KB大小的时候,我放弃等待它加载
- ,如果我读文本文件和colourfile下一个字符,并追加一个正确标记字符,它永远;一个大于200KB的文件,我放弃等待它加载
滚动。如果这么多当前窗口格式可见,它会非常缓慢
如果我逼近,比如,Delphi的或wxWidgets的或什么这个问题,我有一个自定义绘制控件。
什么是Python和Tkinter最直接的方式?
考虑停止使用Tkinter。我不知道你问的是否可能,但Tkinter有很多限制,并且通常过于复杂。 – nosklo 2010-02-17 10:56:06
@nosklo:如果您有其他建议的替代方案,请将其作为答案发布,以便我们可以对其进行修改。 – 2010-02-17 10:57:09
@nosklo:有什么选择?便携式,免费的,有据可查的,容易的,...? – Will 2010-02-17 11:12:48