【问题标题】:displaying a large amount of formatted text in Python在 Python 中显示大量格式化文本
【发布时间】:2017-12-13 22:02:31
【问题描述】:

我有两个大小相同的大文件。一种是 ASCII 纯文本,另一种是颜色编码覆盖,对应文件中每个文本字符一个字节。

这些文件可能很大 - 最大 2.5 MB;可能更多,以后可能超过 100MB。

我要显示的文本是一个可滚动的文本查看器,使用第二个文件作为覆盖。看起来像这样:

Tkinter Text window with tagged text for colours http://img713.imageshack.us/img713/2584/statsviewer01d.png

所以我用 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()

但是,我遇到了可怕的性能问题:

  1. 加载文本

    • 如果我只是使用 textwidget.text = textfile.read() 它会立即加载,即使对于大文件也是如此;但问题是对其进行颜色编码。 (参见上面的代码)。要添加标签,一次一个字符,似乎我强迫它采用painter algorithm;当文件大小约为 300KB 时,我放弃等待它加载
    • 如果我从文本文件和颜色文件中读取下一个字符,并附加一个正确标记的字符,则需要很长时间;一个大于 200KB 的文件,我放弃等待它加载
  2. 滚动。如果在当前窗口中可以看到这么多的格式,它会非常缓慢

如果我在 Dephi 或 wxWidgets 等中解决这个问题,我将有一个自定义绘制的控件。

Python 和 Tkinter 中最直接的方法是什么?

【问题讨论】:

  • 考虑停止使用 Tkinter。我不知道你问的是否可行,但 Tkinter 有很多限制,并且通常使用起来过于复杂。
  • @nosklo:如果您有建议的替代方案,请将其作为答案发布,以便我们投票。
  • @nosklo:有什么替代方案?便携、免费、有据可查、简单、...?
  • @Will:PyGTK、PyQt、WxPy 和其他通常不太受欢迎的(诅咒、XUL 等)。
  • @Devin:“不太喜欢”是非常主观的。我们中的许多人更喜欢 Tkinter 而不是替代品。

标签: python performance richtextbox tkinter


【解决方案1】:

改用可滚动的画布如何,并且只绘制用户公开的文本/热图?无论文件大小如何,这都会让您快速进行初始绘制,并在事物移动时快速重绘。

如果您想要更快的速度和更多的控制,那么您将需要某种虚拟画布,其中只有显示的区域和它周围的区域实际存在,其他任何东西只有在被引用时才会被绘制。我认为 TkInter 并没有给你那么多的控制权,尽管像 Widget Construction Kit (WCK) 这样的东西应该可以做到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    相关资源
    最近更新 更多