Это правильный виджет для использования в этих целях. Основная идея заключается в том, что вы назначаете свойства тегам и применяете теги к диапазонам текста в виджетах. Вы можете использовать команду текстового виджета search
, чтобы найти строки, соответствующие вашему шаблону, который вернет вам достаточную информацию, применив тег к соответствующему диапазону.
Для примера применения тегов к тексту см. Мой ответ на вопрос Advanced Tkinter text box?. Это не совсем то, что вы хотите сделать, но оно показывает основную концепцию.
Ниже приведен пример того, как вы можете расширить класс Text, чтобы включить метод выделения текста, который соответствует шаблону.
В этом коде шаблон должен быть строкой, он не может быть скомпилированным регулярным выражением. Кроме того, шаблон должен соответствовать Tcl's syntax rules for regular expressions.
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")
Это правильный виджет. Посмотрите, что делает ['idle'] (http://hg.python.org/cpython/file/63a00d019bb2/Lib/idlelib). – tzot
@tzot Вы могли бы, по крайней мере, дать лучшее представление о том, какие файлы следует видеть. 'idlelib' содержит много файлов и модулей и т. д., и немного сложно найти что-то, на мой взгляд, без реальной документации, и в основном, если у вас мало опыта. Сначала я приведу пользователей этого сайта к этой статье: https://docs.python.org/3.5/library/idle.html – nbro