Python 3 Tkinter | Изменить цвет / стиль для слов между ':' в Text Widget
Допустим, у нас есть этот текст:
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 ответ
Я думаю, что вы спрашиваете, как применить подсветку к тексту, который начинается с двоеточия, имеет некоторый вид текста и заканчивается двоеточием. Вы можете найти текст, который соответствует этому шаблону с текстовым виджетом search
метод, и вы можете применить выделение, используя функцию тегов текстовых виджетов.
Поскольку вы хотите искать по шаблону, вам нужно использовать поиск по регулярному выражению. Вы делаете это, устанавливая regexp
в True
когда вы звоните search
метод. Поскольку шаблон может быть любой длины, вам также необходимо передать переменную, чтобы tkinter мог вернуть количество символов, с которым он соответствовал. Вы можете использовать эту информацию, чтобы применить выделение.
Примечание: при использовании поиска по регулярному выражению выражение должно следовать синтаксису регулярного выражения Tcl, а не синтаксису 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