Это правильный виджет для использования в этих целях.Основная идея заключается в том, что вы назначаете свойства тегам и применяете теги к диапазонам текста в виджете.Вы можете использовать команду текстового виджета search
, чтобы найти строки, соответствующие вашему шаблону, которые вернут вам достаточно информации, примените тег к соответствующему диапазону.
Для примера того, как применять теги к тексту,см. мой ответ на вопрос Расширенное текстовое поле Tkinter? .Это не совсем то, что вы хотите сделать, но оно показывает основную концепцию.
Ниже приведен пример того, как вы можете расширить класс Text, чтобы включить метод для выделения текста, который соответствует шаблону.
В этом коде шаблон должен быть строкой, он не может быть скомпилированным регулярным выражением.Кроме того, шаблон должен соответствовать синтаксическим правилам Tcl для регулярных выражений .
class CustomText(tk.Text):
'''A text widget with a new method, highlight_pattern()
example:
text = CustomText()
text.tag_configure("red", foreground="#ff0000")
text.highlight_pattern("this should be red", "red")
The highlight_pattern method is a simplified python
version of the tcl code at http://wiki.tcl.tk/3246
'''
def __init__(self, *args, **kwargs):
tk.Text.__init__(self, *args, **kwargs)
def highlight_pattern(self, pattern, tag, start="1.0", end="end",
regexp=False):
'''Apply the given tag to all text that matches the given pattern
If 'regexp' is set to True, pattern will be treated as a regular
expression according to Tcl's regular expression syntax.
'''
start = self.index(start)
end = self.index(end)
self.mark_set("matchStart", start)
self.mark_set("matchEnd", start)
self.mark_set("searchLimit", end)
count = tk.IntVar()
while True:
index = self.search(pattern, "matchEnd","searchLimit",
count=count, regexp=regexp)
if index == "": break
if count.get() == 0: break # degenerate pattern which matches zero-length strings
self.mark_set("matchStart", index)
self.mark_set("matchEnd", "%s+%sc" % (index, count.get()))
self.tag_add(tag, "matchStart", "matchEnd")