Невозможно получить функцию поиска, чтобы выделить все экземпляры цели (текстовый редактор)

Недавно я работал над простым текстовым редактором Python с графическим интерфейсом. Код вызывает эту функцию:

def Find(event=None):
    def find_button_pressed():
        targetfind = e1.get()
        print targetfind
        if targetfind:
            where = textPad.search(targetfind, INSERT, END)
            if where:
                print where
                pastit = where + ('+%dc' % len(targetfind))
                #self.text.tag_remove(SEL, '1.0', END)
                textPad.tag_add(SEL, where, pastit)
                for targetfind in where:
                    textPad.mark_set(INSERT, pastit)
                    textPad.see(INSERT)
                textPad.focus()
    win = Toplevel() 
    Label(win, text="Find:").pack()
    e1 = Entry(win)
    e1.pack()
    Button(win, text="Find Me!!!!", command=find_button_pressed).pack()
    textPad.focus()

Однако я не могу заставить его работать. Предполагается, что код выделяет все слова, которые должны быть найдены, однако пользователь должен нажать на кнопку «Найди меня!!!». столько раз, сколько слов нужно выделить, чтобы выделить их все. искал в Интернете что-нибудь, что могло бы помочь мне исправить эту функцию поиска, но мне не удалось найти никаких объяснений того, как я могу это сделать. Любая помощь в исправлении этой функции поиска будет очень признательна.

РЕДАКТИРОВАТЬ

Это новый код, который до сих пор не решает проблему:

def Find(event=None):
    def find_button_pressed():
        start = "1.0"
        end = "end"
        start = textPad.index(start)
        end = textPad.index(end)
        count= Tkinter.IntVar() 
        count=count
        textPad.mark_set("matchStart", start)
        textPad.mark_set("matchEnd", start)
        textPad.mark_set("searchLimit", end)
        targetfind = e1.get()
        print targetfind
        if targetfind:
            while True:
                where = textPad.search(targetfind, "matchEnd", "searchLimit",
                                       count=count)
                if where == "": break
                elif where:
                    print where
                    pastit = where + ('+%dc' % len(targetfind))
                    textPad.tag_remove(SEL, '1.0', END) 
                    textPad.mark_set("matchStart", where)
                    textPad.mark_set("matchEnd", "%s+%sc" % (where, count.get()))
                    textPad.tag_add(SEL, where, pastit)
                    textPad.see(INSERT)
                    textPad.focus()
    win = Toplevel() 
    Label(win, text="Find:").pack()
    e1 = Entry(win)
    e1.pack()
    Button(win, text="Find Me!!!!", command=find_button_pressed).pack()
    textPad.focus()

person Pseudonym Enigma    schedule 13.02.2015    source источник
comment
Почему вы используете функцию внутри другой функции? В чем преимущество?   -  person nbro    schedule 13.02.2015
comment
@Rinzler: внутренняя функция - это обратный вызов. Я не думаю, что это проблема.   -  person Blckknght    schedule 13.02.2015
comment
Метод поиска возвращает только индекс первого вхождения в виджете «Текст», поэтому вам нужно щелкнуть столько раз, сколько вы сказали, чтобы они были выделены. Попробуйте сначала найти все вхождения в текстовом виджете определенной цели, а затем примените метод tag с tag_add ко всем этим вхождениям.   -  person nbro    schedule 13.02.2015
comment
Я не могу, кажется, управлять. Я добавил цикл for над кодом, который определяет пастит, но единственная разница в том, что выделена только первая буква слова. Измененная часть кода for targetfind in where: pastit = where + ('+%dc' % len(targetfind))   -  person Pseudonym Enigma    schedule 13.02.2015
comment
@PseudonymEnigma См. этот пример Брайана.   -  person nbro    schedule 13.02.2015
comment
Используя пример, я все еще не могу заставить функцию работать. Я добавил свой обновленный (но все еще нефункциональный) код в конец исходного вопроса.   -  person Pseudonym Enigma    schedule 13.02.2015
comment
@Rinzler Я обновил код в своем вопросе, чтобы отразить внесенные мной изменения (благодаря предоставленной вами ссылке). Это все еще не работает. Что я делаю не так?   -  person Pseudonym Enigma    schedule 14.02.2015
comment
Я еще раз обновил код. Теперь он дает мне координаты всех экземпляров цели. Однако он выделяет только последний. Как мне это исправить? Также прошу прощения за то, что случайно перенес это обсуждение в чат. Я не имею в виду, чтобы.   -  person Pseudonym Enigma    schedule 14.02.2015
comment
@PseudonymEnigma: он показывает только последний, потому что каждый раз в цикле вы удаляете все теги SEL.   -  person Bryan Oakley    schedule 14.02.2015
comment
Спасибо. Теперь это работает. Поскольку ответа нет, я опубликую фиксированный код как свой собственный ответ.   -  person Pseudonym Enigma    schedule 14.02.2015


Ответы (1)


Поскольку на мой вопрос ответили многочисленные полезные комментарии, я решил опубликовать свой фиксированный код в качестве ответа.

Это код:

def Find(event=None):
    def find_button_pressed():
        start = "1.0"
        end = "end"
        start = textPad.index(start)
        end = textPad.index(end)
        count= Tkinter.IntVar() 
        count=count
        textPad.mark_set("matchStart", start)
        textPad.mark_set("matchEnd", start)
        textPad.mark_set("searchLimit", end)
        targetfind = e1.get()
        if targetfind:
            while True:
                where = textPad.search(targetfind, "matchEnd", "searchLimit",
                                       count=count)
                if where == "": break
                elif where:
                    pastit = where + ('+%dc' % len(targetfind)) 
                    textPad.mark_set("matchStart", where)
                    textPad.mark_set("matchEnd", "%s+%sc" % (where, count.get()))
                    textPad.tag_add(SEL, where, pastit)
                    textPad.see(INSERT)
                    textPad.focus()
        win.destroy()
    textPad.tag_remove(SEL, '1.0', END)
    win = Toplevel() 
    Label(win, text="Find:").pack()
    e1 = Entry(win)
    e1.pack()
    Button(win, text="Find Me!!!!", command=find_button_pressed).pack()
    textPad.focus()
person Pseudonym Enigma    schedule 14.02.2015