2010-02-17 53 views
6

我有兩個大的相同大小的文件。一個是ASCII純文本,另一個是彩色編碼疊加層,相應文件中每個文本字符一個字節。在Python中顯示大量的格式化文本

這些文件可以很大 - 高達2.5 MB;可能會更多,也許超過100MB以後。

我想顯示的文本是一個可滾動的文本查看器,使用第二個文件作爲覆蓋。看起來像這樣:

Tkinter Text window with tagged text for colours 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() 

不過,我遇到可怕的性能問題:

  1. 加載文本

    • 如果我只是使用textwidget.text = textfile.read()會立即加載,即使是大文件也是如此。但是接下來的問題是對它進行顏色編碼。 (見上面的代碼)。要添加標籤,一次一個字符,似乎我強迫它採取painter algorithm;通過檔約300KB大小的時候,我放棄等待它加載
    • ,如果我讀文本文件和colourfile下一個字符,並追加一個正確標記字符,它永遠;一個大於200KB的文件,我放棄等待它加載
  2. 滾動。如果這麼多當前窗口格式可見,它會非常緩慢

如果我逼近,比如,Delphi的或wxWidgets的或什麼這個問題,我有一個自定義繪製控件。

什麼是Python和Tkinter最直接的方式?

+1

考慮停止使用Tkinter。我不知道你問的是否可能,但Tkinter有很多限制,並且通常過於複雜。 – nosklo 2010-02-17 10:56:06

+0

@nosklo:如果您有其他建議的替代方案,請將其作爲答案發布,以便我們可以對其進行修改。 – 2010-02-17 10:57:09

+0

@nosklo:有什麼選擇?便攜式,免費的,有據可查的,容易的,...? – Will 2010-02-17 11:12:48

回答

3

如何使用可滾動畫布代替,並且只繪製用戶公開的文本/熱圖?無論文件的大小如何,當事情四處移動時,這應該會給你一個快速的初始繪製和快速重繪。

如果你想更快的速度和更多的控制,那麼你就需要某種形式的虛擬畫布只有在顯示面積和各地實際存在的區域,別的只畫成,當它被引用的。雖然像Widget Construction Kit(WCK)應該這樣做,但我認爲TkInter不會給你太多的控制權。

+0

[顯示大量數據](http://effbot.org/zone/wck-4.htm) – wwii 2016-12-15 21:56:30