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:
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:
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
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?
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
@nosklo: Wenn Sie eine vorgeschlagene Alternative haben, bitte posten Sie diese als Antwort, damit wir sie verbessern können. –
@nosklo: Was sind die Alternativen? Tragbar, kostenlos, gut dokumentiert, einfach, ...? – Will