我有两个大小相同的文件。一个是ASCII纯文本,另一个是颜色编码的叠加,相应文件中每个文本字符一个字节。
这些文件可能很大 - 高达2.5 MB;可能会更多,可能超过100MB。
我想显示文本是一个可滚动的文本查看器,使用第二个文件作为叠加层。看起来像这样:
所以我在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()
然而,我遇到了可怕的性能问题:
加载文字
滚动。如果在当前窗口中显示这么多格式,那就非常慢了
如果我在Dephi或wxWidgets或其他任何地方接近这个问题,我会有一个自定义控件。
Python和Tkinter中最简单的方法是什么?
答案 0 :(得分:3)
如何使用可滚动画布,并且只绘制用户公开的文本/热图?无论文件大小如何,这都可以让你快速初步绘制并快速重绘。
如果你想要更高的速度和更多的控制,那么你需要某种虚拟画布,其中只有显示的区域和它周围的区域实际存在,其他任何东西只在被引用时被绘制。我不认为TkInter会给你那么多的控制权,虽然像Widget Construction Kit(WCK)这样的东西应该这样做。