我有两个大小相同的大文件。一种是 ASCII 纯文本,另一种是彩色编码覆盖,对应文件中每个文本字符一个字节。
这些文件可能很大 - 高达 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 时,我放弃等待它加载
- 如果我从文本文件和颜色文件中读取下一个字符,并附加一个正确标记的字符,则需要很长时间;一个大于 200KB 的文件,我放弃等待它加载
滚动。如果在当前窗口中可见这么多格式,则显示速度非常慢
如果我在 Dephi 或 wxWidgets 或其他软件中解决这个问题,我会使用自定义绘制的控件。
Python 和 Tkinter 中最直接的方法是什么?
最佳答案
如何使用可滚动的 Canvas ,只绘制用户显示的文本/热图?无论文件大小如何,这都可以让您快速进行初始绘制并在内容移动时快速重绘。
如果你想要更快的速度和更多的控制,那么你需要某种虚拟 Canvas ,其中只有显示区域和它周围的区域实际存在,其他任何东西都只在它被引用时绘制。我不认为 TkInter 会给你那么多的控制权,尽管 Widget Construction Kit (WCK) 之类的东西应该可以。
关于python - 在 Python 中显示大量格式化文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2279063/