How to highlight text in a tkinter Text widget How to highlight text in a tkinter Text widget tkinter tkinter

How to highlight text in a tkinter Text widget


It's the right widget to use for these purposes. The basic concept is, you assign properties to tags, and you apply tags to ranges of text in the widget. You can use the text widget's search command to find strings that match your pattern, which will return you enough information apply a tag to the range that matched.

For an example of how to apply tags to text, see my answer to the question Advanced Tkinter text box?. It's not exactly what you want to do but it shows the basic concept.

Following is an example of how you can extend the Text class to include a method for highlighting text that matches a pattern.

In this code the pattern must be a string, it cannot be a compiled regular expression. Also, the pattern must adhere to 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")


Are you using tkinter.ttk? If so, import tkinter.ttk first then tkinter in your import statement list. That worked for me. Here's a picture