Теги Python 2.7 Tkinter не отображаются, хотя активны - PullRequest
0 голосов
/ 30 августа 2018

В настоящее время я разрабатываю текстовый редактор (в Python 2.7) для языка моделирования. Все работает как положено, кроме поведения tkinker в тех случаях, когда в текстовый виджет добавляется много тегов. Чтобы выделить комментарии в модели, я использую цикл, который перебирает весь текст, находит каждую строку, содержащую тег «#», собирает начальную точку этого символа и впоследствии отмечает всю строку (начиная с # ) как комментарий:

def color_sl_comments(self):
    complete_text_as_lines = self.text.get('1.0', tk.END + '-1c').splitlines()
    for line in complete_text_as_lines:
        if '#' in line:
            s_l = complete_text_as_lines.index(line) + 1
            s_c = line.index('#')
            e_l = s_l
            e_c = len(line)
            self.color_comment(s_l, s_c, e_l, e_c)

def color_comment(self, sl, sc, el, ec):
    name = "comment%s.%s.%s.%s." % (sl, sc, el, ec)
    self.text.tag_add(name, "%s.%s" % (sl, sc), "%s.%s" % (el, ec))
    self.text.tag_config(name, background="white", foreground="grey")

Цвет первых комментариев изменяется, как и ожидалось, но последние остаются со схемой окраски по умолчанию. Однако после отладки кода я обнаружил, что соответствующему тегу присвоен текст, т. Е. Все теги есть, но цвет в окне просто не изменяется. Более интересным моментом является то, что: если я обновлю соответствующий комментарий, например добавлю еще один дополнительный символ, тогда цвет комментария будет показан правильно Удаление этого символа восстанавливает схему окраски, и текст больше не отображается как комментарий. Это похоже на ошибку в tkinker, где не все теги отображаются, хотя они и есть. Другая часть кода делает то же самое, но для многострочных комментариев. Здесь первый ML-комментарий окрашен правильно, а второй - нет. Поскольку проект слишком велик, чтобы вставить его сюда, здесь ссылка . Образец модели находится в исходном каталоге.

1 Ответ

0 голосов
/ 30 августа 2018

Насколько я понимаю, ваша проблема, кажется, в повторяющихся строках. Если две или более строки совпадают, complete_text_as_lines.index(line) вернет первую из них.

Вместо использования index() используйте

for number, line in enumerate(complete_text_as_lines):

Таким образом, number всегда будет правильным номером строки (после того, как вы сделаете +1)


Также я заметил, что, поскольку вы устанавливаете фон на белый, selectbackground также белый, что делает невозможным просмотр того, что вы выбрали. Иметь стандартный цвет подсветки selectbackground="SystemHighlight" мне подходит.

...