Python 3 Tkinter |Изменить цвет / стиль для слов между ':' в Text Widget - PullRequest
0 голосов
/ 22 октября 2018

Допустим, у нас есть этот текст:

text = "You don't need to try to find hidden meaning:\nin this text :sun_with_face:!\nthis text : does not have any :meaning :D"

Теперь обратите внимание на :sun_with_face: в тексте выше?Это то, что я пытаюсь как-то выделить, изменив жирность и цвет текстового виджета на этот конкретный раздел.

Проблема:

  • Как отфильтровать текстдля :these_words:?Вы можете заметить, что это emoji.demojized() эмодзи, поэтому необязательным решением было бы выделить все слова, которые есть в списке emoji.UNICODE_EMOJI, но я чувствую, что это потребует много времени и ресурсов (так как список содержит более 1000 элементов))

  • Как выделить нужные вещи.Хотя мы могли бы как-то решить первую проблему, эти демоджизированные эмодзи находятся в середине текста ...

Редактировать

Просто чтобыуточнить: я знаю, как выделить текст из этого вопроса .Мне просто нужно знать местоположение слова, чтобы выделить его, что является сложной частью.Также: sun_with_face :.Это может быть что угодно, если его открывать и закрывать с помощью ':' и между ними есть нет пробелов () и символов новой строки (\n).

1 Ответ

0 голосов
/ 23 октября 2018

Я думаю, что вы спрашиваете, как применить подсветку к тексту, который начинается с двоеточия, имеет некоторый интервал текста и заканчивается двоеточием.Вы можете найти текст, который соответствует этому шаблону, с помощью метода текстового виджета search, и вы можете применить выделение, используя функцию тегов текстовых виджетов.

Поскольку вы хотите искать по шаблону, вам нужноиспользовать поиск по регулярному выражению.Вы делаете это, устанавливая regexp в True при вызове метода search.Поскольку шаблон может быть любой длины, вам также необходимо передать переменную, чтобы tkinter мог вернуть количество символов, с которым он соответствовал.Вы можете использовать эту информацию для применения выделения.

Примечание: при использовании поиска по регулярному выражению выражение должно следовать синтаксису *1000* регулярного выражения *1000*, а не Python.Есть некоторые тонкие различия.

Вот пример, который находит все совпадения двоеточия, за которым сразу следует самая короткая группа непробельных символов, за которой следует двоеточие.Затем он добавляет тег «выделить» к каждому совпадению:

countVar = tk.IntVar()
start_index = "1.0"
while start_index:
    index = text_widget.search(r':\S+?:', start_index, stopindex="end",
                               count=countVar, regexp=True)
    if index:
        # ie: a match was found
        end_index = "{} + {} chars".format(index, countVar.get())
        text_widget.tag_add("highlight", index, end_index)
        start_index = end_index
    else:
        start_index = None
...