2010-02-17 5 views
6

Ich habe zwei große identisch große Dateien. Einer ist ASCII-Klartext und der andere ist eine farbcodierte Überlagerung, ein Byte pro Textzeichen in der entsprechenden Datei.Anzeige einer großen Menge an formatiertem Text in Python

Diese Dateien können groß sein - bis zu 2,5 MB; möglicherweise wesentlich mehr, vielleicht über 100 MB später.

Ich möchte den Text anzeigen ist ein scrollbarer Text Viewer, mit der zweiten Datei als Overlay. Suchen Sie etwas wie folgt aus:

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

Also machte ich ein einfaches tkinter Text-Widget Fenster in Python mit Scrollbar und so.

Mein Code sieht wie folgt aus:

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

aber ich laufe in schreckliche Performance-Probleme:

  1. Laden der Text

    • wenn ich einfach textwidget.text verwenden = textfile.read() lädt sofort, auch für die große Datei; aber dann ist das Problem die Farbcodierung. (siehe Code oben). Um die Tags jeweils um ein Zeichen zu ergänzen, scheint es, als zwinge ich sie dazu, eine painter algorithm; Zu der Zeit, wenn die Datei etwa 300 KB groß ist, gebe ich auf, es zu laden
    • Wenn ich das nächste Zeichen aus der Textdatei und der Farbdatei zu lesen, und einen richtig markierten Charakter anhängen, dauert es ewig; eine Datei größer als etwa 200KB und ich gebe auf, es zu laden
  2. Scrollen. Wenn dies viel im aktuellen Fenster sichtbar Formatierung, ist es sehr langsam

Wenn ich dieses Problem näherte geht in, sagen wir, Dephi oder wxWidgets oder was auch immer, würde ich habe eine benutzerdefinierte gezogenen Kontrolle.

Was ist der einfachste Weg in Python und Tkinter?

+1

betrachten stoppen mit Tkinter. Ich weiß nicht, ob das, was Sie fragen, möglich ist, aber Tkinter hat viele Einschränkungen und ist im Allgemeinen zu komplex, um damit zu arbeiten. – nosklo

+0

@nosklo: Wenn Sie eine vorgeschlagene Alternative haben, bitte posten Sie diese als Antwort, damit wir sie verbessern können. –

+0

@nosklo: Was sind die Alternativen? Tragbar, kostenlos, gut dokumentiert, einfach, ...? – Will

Antwort

3

Wie wäre es stattdessen mit einem scrollbaren Canvas, und nur die Text/Heatmap, die vom Benutzer ausgesetzt ist, zu zeichnen? Das sollte Ihnen eine schnelle Anfangszeichnung und ein schnelles Neuzeichnen geben, wenn sich Dinge bewegen, unabhängig von der Größe der Datei.

Wenn Sie mehr Geschwindigkeit und mehr Kontrolle wünschen, dann würden Sie eine Art von virtuellem Canvas benötigen, wo nur der Bereich auf dem Display und ein Bereich darum existiert, alles andere wird nur gezeichnet und wenn es referenziert wird. Ich glaube nicht, dass TkInter Ihnen so viel Kontrolle gibt, obwohl Dinge wie das Widget Construction Kit (WCK) ausreichen sollten.

+0

[Anzeige großer Datenmengen] (http://effbot.org/zone/wck-4.htm) – wwii