from tkinter import *

def hi(event):
    print(txt.get('1.0',END))
    txt.delete('1.0',END)

root = Tk()

lbl = Label(root, text="client")
lbl.pack()

txt = Text(root, height=10, width=50)
txt.pack()
txt.bind('<Return>', hi)


btn = Button(root, text="OK")
btn.pack()

root.mainloop()

Cuando elimino el contenido del widget de texto, queda una línea en blanco. ¿Cómo prevenir eso?

enter image description here

2
김수환 27 feb. 2018 a las 18:10

3 respuestas

La mejor respuesta

Los enlaces integrados hacen que se inserte una nueva línea cuando presiona la tecla de retorno. Cuando crea un enlace, su función enlazada se llama antes el comportamiento predeterminado. Por lo tanto, cuando presiona Intro, su función elimina todo y, a continuación, la acción predeterminada inserta una nueva línea.

Si desea evitar que suceda la acción predeterminada, su función debe devolver la cadena break:

def hi(event):
    print(txt.get('1.0',END))
    txt.delete('1.0',END)
    return "break"
3
Bryan Oakley 27 feb. 2018 a las 15:32

Debe solicitar a tkinter que no propague ese evento a otros controladores de la siguiente manera:

from tkinter import *

def hi(event):
    print(txt.get('1.0',END))
    txt.delete('1.0',END)
    return "break"


root = Tk()

lbl = Label(root, text="client")
lbl.pack()

txt = Text(root, height=10, width=50)
txt.pack()
txt.bind('<Return>', hi)


btn = Button(root, text="OK")
btn.pack()

root.mainloop()
1
Billal Begueradj 27 feb. 2018 a las 15:32

Lo que sucede es que el widget de texto aún obtiene el retorno que ingresó. La vinculación de Enter no inhibe la propagación del evento una vez que finaliza su función, a menos que lo modifique para cancelar la propagación del evento devolviendo la cadena de interrupción, de esta manera:

def hi(event):
    print(txt.get('1.0',END))
    txt.delete('1.0',END)
    return 'break'
2
progmatico 27 feb. 2018 a las 15:32