【发布时间】:2017-12-13 22:02:31
【问题描述】:
我有两个大小相同的大文件。一种是 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()
但是,我遇到了可怕的性能问题:
-
加载文本
- 如果我只是使用 textwidget.text = textfile.read() 它会立即加载,即使对于大文件也是如此;但问题是对其进行颜色编码。 (参见上面的代码)。要添加标签,一次一个字符,似乎我强迫它采用painter algorithm;当文件大小约为 300KB 时,我放弃等待它加载
- 如果我从文本文件和颜色文件中读取下一个字符,并附加一个正确标记的字符,则需要很长时间;一个大于 200KB 的文件,我放弃等待它加载
滚动。如果在当前窗口中可以看到这么多的格式,它会非常缓慢
如果我在 Dephi 或 wxWidgets 等中解决这个问题,我将有一个自定义绘制的控件。
Python 和 Tkinter 中最直接的方法是什么?
【问题讨论】:
-
考虑停止使用 Tkinter。我不知道你问的是否可行,但 Tkinter 有很多限制,并且通常使用起来过于复杂。
-
@nosklo:如果您有建议的替代方案,请将其作为答案发布,以便我们投票。
-
@nosklo:有什么替代方案?便携、免费、有据可查、简单、...?
-
@Will:PyGTK、PyQt、WxPy 和其他通常不太受欢迎的(诅咒、XUL 等)。
-
@Devin:“不太喜欢”是非常主观的。我们中的许多人更喜欢 Tkinter 而不是替代品。
标签: python performance richtextbox tkinter