Подтвердить что ты не робот

Как выделить текст в текстовом виджете tkinter

Я хочу знать, как изменить стиль определенных слов и выражений на основе определенных шаблонов.

Я использую виджет Tkinter.Text, и я не уверен, как это сделать (та же идея подсветки синтаксиса в текстовых редакторах). Я не уверен, даже если это правильный виджет для использования с этой целью.

4b9b3361

Ответ 1

Это правильный виджет для использования в этих целях. Основная идея заключается в том, что вы назначаете свойства тегам и применяете теги к диапазонам текста в виджетах. Вы можете использовать команду текстового виджета 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 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")