Как выделить текст в текстовом виджете tkinter - PullRequest
13 голосов
/ 23 сентября 2010

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

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

1 Ответ

34 голосов
/ 23 сентября 2010

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