在Python中显示大量格式化文本
我有两个大小相同的大文件,一个是普通的ASCII文本,另一个是颜色编码的覆盖文件,每个文本字符对应一个字节。
这些文件可能很大,最大可以达到2.5MB,甚至以后可能会超过100MB。
我想在一个可以滚动的文本查看器中显示这些文本,并使用第二个文件作为颜色覆盖。效果大概是这样的:
Tkinter文本窗口,带有颜色标记的文本 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()
但是,我遇到了很糟糕的性能问题:
加载文本时
- 如果我直接用textwidget.text = textfile.read()来加载文本,文件会瞬间加载完成,即使是大文件;但问题是如何给它加上颜色编码。(见上面的代码)。如果我一个字符一个字符地添加标签,似乎就像在用一种叫做画家算法;当文件大小达到大约300KB时,我就放弃等待它加载了。
- 如果我从文本文件和颜色文件中读取下一个字符,并添加一个正确标记的字符,这样加载就要花很长时间;一旦文件超过200KB,我就放弃等待了。
滚动时。如果当前窗口中显示了这么多格式化内容,滚动会非常慢。
如果我用德尔菲(Dephi)或wxWidgets等其他工具来处理这个问题,我会使用一个自定义绘制的控件。
在Python和Tkinter中,最简单的方法是什么呢?
1 个回答
4
你可以试试用一个可滚动的画布,这样只在用户能看到的地方绘制文字或热图。这样做可以让初次显示变得很快,而且当内容移动时重新绘制也很快,不管文件有多大。
如果你想要更快的速度和更多的控制,那就需要一种虚拟画布,只有当前显示的区域和周围的区域是真实存在的,其他地方只有在需要的时候才会被绘制出来。我觉得TkInter可能无法提供这么多控制,不过像Widget Construction Kit(WCK)这样的工具应该可以做到。