отображение большого количества форматированного текста в Python - PullRequest
6 голосов
/ 17 февраля 2010

У меня есть два больших файла одинакового размера. Одним из них является простой текст 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()

Однако я сталкиваюсь с ужасными проблемами с производительностью:

  1. загрузка текста

    • если я просто использую textwidget.text = textfile.read (), он загружается мгновенно, даже для большого файла; но тогда проблема в цветовом кодировании. (см. Код выше) . Чтобы добавить теги, по одному символу за раз, кажется, я заставляю его использовать алгоритм рисования ; к моменту, когда размер файла составляет около 300 КБ, я перестаю ждать его загрузки
    • если я прочитаю следующий символ из текстового файла и цветного файла и добавлю правильно помеченный символ, это займет вечность; файл размером более 200 КБ, и я перестаю ждать его загрузки
  2. скроллинг. Если это большое форматирование видно в текущем окне, оно идет очень медленно

Если бы я подходил к этой проблеме, скажем, в Dephi или wxWidgets или чем-то еще, у меня был бы нарисованный вручную элемент управления.

Какой самый простой способ в Python и Tkinter?

1 Ответ

3 голосов
/ 18 февраля 2010

Как насчет использования вместо этого прокручиваемого холста и только рисования текста / тепловой карты, отображаемой пользователем? Это должно дать вам быстрое начальное рисование и быструю перерисовку, когда все движется, независимо от размера файла.

Если вам нужна большая скорость и больший контроль, то вам понадобится какой-то виртуальный холст, где фактически существует только отображаемая область и область вокруг нее, а все остальное рисуется только тогда, когда на него ссылаются. Я не думаю, что TkInter дает вам такой контроль, хотя такие вещи, как Widget Construction Kit (WCK), должны делать.

...