le_wofl
le_wofl

Reputation: 303

Highlighting certain characters in Tkinter

I'm creating a simple text editor in Python 3.4 and Tkinter. At the moment I'm stuck on the find feature.

I can find characters successfully but I'm not sure how to highlight them. I've tried the tag method without success, error:

str object has no attribute 'tag_add'. 

Here's my code for the find function:

def find(): # is called when the user clicks a menu item
    findin = tksd.askstring('Find', 'String to find:')
    contentsfind = editArea.get(1.0, 'end-1c') # editArea is a scrolledtext area
    findcount = 0
    for x in contentsfind:
        if x == findin:
            findcount += 1
            print('find - found ' + str(findcount) + ' of ' + findin)
    if findcount == 0:
        nonefound = ('No matches for ' + findin)
        tkmb.showinfo('No matches found', nonefound)
        print('find - found 0 of ' + findin)

The user inputs text into a scrolledtext field, and I want to highlight the matching strings on that scrolledtext area.

How would I go about doing this?

Upvotes: 0

Views: 404

Answers (1)

Bryan Oakley
Bryan Oakley

Reputation: 386010

Use tag_add to add a tag to a region. Also, instead of getting all the text and searching the text, you can use the search method of the widget. I will return the start of the match, and can also return how many characters matched. You can then use that information to add the tag.

It would look something like this:

...
editArea.tag_configure("find", background="yellow")
...

def find():
    findin = tksd.askstring('Find', 'String to find:')

    countVar = tk.IntVar()
    index = "1.0"
    matches = 0

    while True:
        index = editArea.search(findin, index, "end", count=countVar)
        if index == "": break

        matches += 1
        start = index
        end = editArea.index("%s + %s c" % (index, countVar.get()))
        editArea.tag_add("find", start, end)
        index = end

Upvotes: 1

Related Questions