Tidak dapat menemukan fungsi untuk menyorot semua contoh target (editor teks)

baru-baru ini saya sedang mengerjakan editor teks biasa GUI python. Kode memanggil fungsi ini:

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()

Namun, saya tidak bisa menjalankannya. Kode tersebut seharusnya menyorot semua kata yang seharusnya ditemukan, namun pengguna harus mengklik tombol "Temukan Saya!!!" sebanyak kata yang perlu disorot untuk menyorot semuanya. telah mencari di internet untuk mencari apa pun yang mungkin dapat membantu saya memperbaiki fitur pencarian ini, tetapi saya belum berhasil menemukan penjelasan apa pun tentang bagaimana saya dapat melakukannya. Bantuan apa pun dalam memperbaiki fitur pencarian ini akan sangat dihargai.

Sunting

Ini adalah kode baru yang masih belum menyelesaikan masalah:

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 sumber
comment
Mengapa Anda menggunakan suatu fungsi di dalam fungsi lain? Apa keuntungannya?   -  person nbro    schedule 13.02.2015
comment
@Rinzler: Fungsi bagian dalam adalah panggilan balik. Menurutku bukan itu masalahnya.   -  person Blckknght    schedule 13.02.2015
comment
Metode pencarian hanya mengembalikan indeks kemunculan pertama di widget Teks, oleh karena itu Anda harus mengklik sebanyak yang Anda katakan agar indeks tersebut disorot. Coba temukan dulu semua kemunculan di widget Teks dari target tertentu, lalu terapkan metode tag dengan tag_add Anda ke semua kemunculan ini.   -  person nbro    schedule 13.02.2015
comment
Sepertinya saya tidak bisa mengaturnya. Saya menambahkan loop for di atas kode yang mendefinisikan pastit, tetapi satu-satunya perbedaan adalah hanya huruf pertama dari kata tersebut yang disorot. Bagian kode yang dimodifikasi adalah for targetfind in where: pastit = where + ('+%dc' % len(targetfind))   -  person Pseudonym Enigma    schedule 13.02.2015
comment
@PseudonymEnigma Lihat contoh ini oleh Bryan.   -  person nbro    schedule 13.02.2015
comment
Dengan menggunakan contoh, saya masih tidak dapat menjalankan fungsinya. Saya telah menambahkan kode saya yang diperbarui (tetapi masih tidak berfungsi) di akhir pertanyaan awal saya.   -  person Pseudonym Enigma    schedule 13.02.2015
comment
@Rinzler Saya telah memperbarui kode dalam pertanyaan saya untuk mencerminkan perubahan yang saya buat (berkat tautan yang Anda berikan). Masih tidak bekerja. Apa yang saya lakukan salah?   -  person Pseudonym Enigma    schedule 14.02.2015
comment
Saya sekali lagi memperbarui kodenya. Sekarang, ini memberi saya koordinat semua contoh target. Namun, ini hanya menyoroti yang terakhir. Bagaimana cara memperbaikinya? Juga, saya minta maaf karena tidak sengaja memindahkan diskusi ini ke chat. Aku tidak bermaksud.   -  person Pseudonym Enigma    schedule 14.02.2015
comment
@PseudonymEnigma: ini hanya menampilkan yang terakhir karena setiap kali melalui loop Anda menghapus semua tag SEL.   -  person Bryan Oakley    schedule 14.02.2015
comment
Terima kasih. Sekarang berhasil. Karena tidak ada jawaban, saya akan memposting kode tetap sebagai jawaban saya sendiri.   -  person Pseudonym Enigma    schedule 14.02.2015


Jawaban (1)


Ketika pertanyaan saya dijawab melalui banyak komentar bermanfaat, saya memutuskan untuk memposting kode tetap saya sebagai jawaban.

Ini kodenya:

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