Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
reemplazar palabras contenida en widget text de tkinter.
#1
Hola, buen día, ¿Cómo estan? les cuento lo que me ocurre, en el editor de texto que estoy
programando quiero que sea tambien un corrector ortografico y para ello debo reemplazar
palabras, la pregunta ¿es cierto que para reemplazar una palabra tengo que borrar todo el
contenido?.-
Intente borrar tan solo la palabra mal escrita y la unica manera que encontre fue borrar todo
porque poniendo la fila/columna lo que hace es conservar la palabra erronea y la pone a continuacion.-
Les dejo la función para que la analicen porque tampoco creo que esto no se haga de forma
automática, lo que hace es extraer la palabra con un doble clic…

Código:
def corrector(parametros, event):
    filaColumna = parametros[0].index("insert")
    lista = filaColumna.split('.')
    lista.append(lista[0])
    lista.append(lista[1])
   
    while True:
        lista[2] = lista[0]
        lista[3] = lista[1]
        restarColUno = int(lista[1])-1
        lista[1] = str(restarColUno)
        finalColInicio = f"{lista[0]}.{lista[1]}"
        finalColFinal  = f"{lista[2]}.{lista[3]}"
        letra = parametros[0].get(finalColInicio, finalColFinal)
        if lista[1] == '-1' or letra == " ":
            inicio = int(lista[1])+1
            final = int(lista[3])+1
            lista[1] = str(inicio)
            lista[3] = str(final)
            finalColInicio = f"{lista[0]}.{lista[1]}"
            lista.append(finalColInicio)
            break
   
    contenido = parametros[0].get("1.0",tk.END)
    largo = len(contenido)
    while True:
        lista[0] = lista[2]
        lista[1] = lista[3]
        sumarColDos = int(lista[3])+1
        lista[3] = str(sumarColDos)
        finalColInicio = f"{lista[0]}.{lista[1]}"
        finalColFinal  = f"{lista[2]}.{lista[3]}"
        letra = parametros[0].get(finalColInicio, finalColFinal)
        if int(lista[3]) >= largo or letra == " ":
            restarColDos = int(lista[3])-1
            lista[3] = str(restarColDos)
            tmpFinalCol = f"{lista[2]}.{lista[3]}"
            lista.append(tmpFinalCol)
            palabra = parametros[0].get(lista[4], lista[5])
            break

    corrector = ""
    with codecs.open('Ortografía.txt', 'r', encoding='utf-8') as archivo:
        for linea in archivo:
            listaTmp = linea.rstrip('\n')
            lista = listaTmp.split(',')
            if palabra in lista[1]:
                corrector = lista[0]
                break
           
    if len(corrector) >= 1:
        men = f" La palabra correcta es..: {corrector}\n ¿desea corregirla?"
        siNo = messagebox.askyesno("Corrector ortográfico.",men)   
        if siNo:
            parametros[0].delete(1.0, "end")
            parametros[0].insert(finalColInicio, corrector)
    return True      

Slds. Daniel ☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#2
Hola, Daniel.

¿Por qué no podrías eliminar únicamente los caracteres donde se encuentra la palabra que querés corregir? Una vez borrados, usás insert() para agregar el texto corregido. Un ejemplo básico que reemplaza "¡Hola, mundo!" por "¡Hola, world!" al presionar un botón:

  1. import tkinter as tk
  2.  
  3. def replace():
  4. # Eliminar caracteres en los índices 7-12 en la primera fila.
  5. text.delete("1.7", "1.12")
  6. # Insertar la nueva palabra.
  7. text.insert("1.7", "world")
  8.  
  9. root = tk.Tk()
  10. text = tk.Text()
  11. text.insert("1.0", "¡Hola, mundo!")
  12. text.pack(fill=tk.BOTH)
  13. button = tk.Button(text="Reemplazar", command=replace)
  14. button.pack(after=text)
  15. root.mainloop()


Saludos
Responder
#3
Hola francisco, maravilloso a mi(y no se porque barullo mental) no me salía.-
Te pido una cosita mas, me podrías poner un ej. sencillo de búsqueda, dejo lo
que encontré en internet, funciona pero hay líneas que no entiendo, intente
mis propios comentarios pero no alcanza(no me gusta tan solo copiar/pegar), desde ya gracias.-


Código:
def find():
    #text.tag_remove('found', '1.0', END)
    s = edit.get() # s obtiene la palabra a buscar
    if (s):
        idx = '1.0'
        while 1:
            idx = text.search(s, idx, nocase = 1, stopindex = END) # encuentra la primera aparición de la palabra a buscar
            if not idx:
                break
            lastidx = '% s+% dc' % (idx, len(s))
            text.tag_add('found', idx, lastidx)
            idx = lastidx
        text.tag_config('found', foreground ='red')
        edit.focus_set()


Slds. Daniel ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#4
Hola francisco, hola gente ¿ cómo están ?, bueno al fin lo logre, parece
no haber error y con mucho menos líneas de código.-
Mi certeza es que hay algún método para hacer un doble clic y que
el lenguaje capture la fila/columna donde inicia y donde termina la palabra
al mismo tiempo pero a pesar de mucho buscar no lo encuentro.-

Código:
def corregir(parametros):
    filaColumnaInicio = parametros[0].index("insert")
    filaColumnaTmp = filaColumnaInicio
    lista = filaColumnaTmp.split('.')
    palabra = ""
   
    while True:
        letra = parametros[0].get(filaColumnaTmp)
        if letra == " ":
            break
        else:
            palabra += letra
            columna = int(lista[1])+1
            lista[1] = str(columna)
            filaColumnaTmp = (f"{lista[0]}.{lista[1]}")

    filaColumnaFinal = f"{lista[0]}.{lista[1]}"
    corrector = ""
    with codecs.open('Ortografía.txt', 'r', encoding='utf-8') as archivo:
        for linea in archivo:
            linea = linea.rstrip('\n')
            lista = linea.split(',')
            if palabra in lista[1]:
                corrector = lista[0]
                break

    if len(corrector) >= 1:
        men = f" La palabra correcta es..: {corrector}\n ¿desea corregirla?"
        siNo = messagebox.askyesno("Corrector ortográfico.",men)   
        if siNo:
            parametros[0].delete(filaColumnaInicio, filaColumnaFinal)
            parametros[0].insert(filaColumnaInicio, corrector)

    return

Slds. Daniel ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#5
Hola, Daniel.

Excelente. Seguramente haya un evento para esto último que comentás. Pero te invito a que crees otro tema para ser más ordenados Smile.

Saludos
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)