У меня есть два больших файла одинакового размера. Одним из них является простой текст ASCII, а другим - наложение с цветовой кодировкой, по одному байту на текстовый символ в соответствующем файле.
Эти файлы могут быть большими - до 2,5 МБ; возможно существенно больше, возможно, более 100 МБ позже.
Я хочу отобразить текст в прокручиваемом средстве просмотра текста, используя второй файл в качестве наложения. Выглядит примерно так:
Tkinter Текстовое окно с помеченным текстом для цветов http://img713.imageshack.us/img713/2584/statsviewer01d.png
Итак, я сделал простое окно виджета Tkinter Text в Python с полосой прокрутки и тому подобное.
Мой код выглядит так:
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()
Однако я сталкиваюсь с ужасными проблемами с производительностью:
загрузка текста
- если я просто использую textwidget.text = textfile.read (), он загружается мгновенно, даже для большого файла; но тогда проблема в цветовом кодировании. (см. Код выше) . Чтобы добавить теги, по одному символу за раз, кажется, я заставляю его использовать алгоритм рисования ; к моменту, когда размер файла составляет около 300 КБ, я перестаю ждать его загрузки
- если я прочитаю следующий символ из текстового файла и цветного файла и добавлю правильно помеченный символ, это займет вечность; файл размером более 200 КБ, и я перестаю ждать его загрузки
скроллинг. Если это большое форматирование видно в текущем окне, оно идет очень медленно
Если бы я подходил к этой проблеме, скажем, в Dephi или wxWidgets или чем-то еще, у меня был бы нарисованный вручную элемент управления.
Какой самый простой способ в Python и Tkinter?