2010-02-17 7 views
6

Ho due grandi file di dimensioni identiche. Uno è testo in chiaro ASCII e l'altro è una sovrapposizione con codice colore, un byte per carattere di testo nel file corrispondente.Visualizzazione di una grande quantità di testo formattato in Python

Questi file possono essere grandi - fino a 2,5 MB; probabilmente molto di più, forse oltre 100 MB più tardi.

Desidero visualizzare il testo è un visualizzatore di testo scorrevole, utilizzando il secondo file come overlay. Guardando qualcosa di simile:

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

Così ho fatto una semplice finestra widget di tkinter testo in Python con barra di scorrimento e così via.

Il mio codice è simile al seguente:

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() 

Tuttavia, ho incontrato problemi di prestazioni orribili:

  1. caricano il testo

    • se io semplicemente uso textwidget.text = textfile.read() si carica istantaneamente, anche per il file di grandi dimensioni; ma poi il problema è codificato a colori. (vedere il codice sopra). Per aggiungere i tag, un personaggio alla volta, sembra che lo imponga di prendere un painter algorithm; nel momento in cui il file ha una dimensione di circa 300 KB, rinuncio ad aspettare che carichi
    • se leggo il prossimo carattere dal file di testo e il file di colori e aggiungo un carattere opportunamente etichettato, ci vuole per sempre; un file più grande di circa 200 KB e mi arrendo in attesa del caricamento
  2. Scorrimento. Se questa formattazione molto visibile nella finestra corrente, va molto lentamente

Se mi stavo avvicinando a questo problema, diciamo, Dephi o wxWidgets o qualsiasi altra cosa, avrei un controllo personalizzato-disegnato.

Qual è il modo più diretto in Python e Tkinter?

+1

considerare l'interruzione utilizzando Tkinter. Non so se ciò che chiedi è possibile, ma Tkinter ha molti limiti ed è generalmente troppo complesso con cui lavorare. – nosklo

+0

@nosklo: Se si dispone di un'alternativa suggerita, si prega di postarla come risposta in modo da poterla revocare. –

+0

@nosklo: quali sono le alternative? Portatile, gratuito, ben documentato, facile, ...? – Will

risposta

3

Come utilizzare invece una tela scorrevole e disegnare solo il testo/mappa di calore che viene esposto dall'utente? Questo dovrebbe darti un rapido sorteggio iniziale e un rapido ridisegno quando le cose si muovono, indipendentemente dalla dimensione del file.

Se si desidera maggiore velocità e maggiore controllo, è necessario disporre di una sorta di tela virtuale in cui solo l'area esposta e un'area circostante effettivamente esiste, qualsiasi altra cosa viene disegnata come e quando viene referenziata. Non credo che TkInter ti dia tanto controllo, anche se cose come il Widget Construction Kit (WCK) dovrebbe fare.

+0

[Visualizzazione di grandi quantità di dati] (http://effbot.org/zone/wck-4.htm) – wwii