¿Cómo se comprueba si un widget tiene foco en Tkinter?

from Tkinter import * app = Tk() text_field = Entry(app) text_field.pack() app.mainloop() 

Quiero poder verificar si text_field está actualmente seleccionado o enfocado, para saber si debo hacer algo con su contenido cuando el usuario presiona enter.

Si desea hacer algo cuando el usuario presiona, ingrese solo si el foco está en el widget de entrada, simplemente agregue un enlace al widget de entrada. Solo se disparará si ese widget tiene foco. Por ejemplo:

 >>> from Tkinter import * >>> root=Tk() >>> e1=Entry(root) >>> e1.pack() >>> e2=Entry(root) >>> e2.pack() >>> def handleReturn(event): ... print "return: event.widget is",event.widget ... print "focus is:", root.focus_get() ... >>> e1.bind("", handleReturn) 

Observe que solo se llama al controlador si la primera entrada tiene el foco cuando presiona regresar.

Si realmente desea un enlace global y necesita saber qué widget tiene el foco, use el método focus_get () en el objeto raíz. En el siguiente ejemplo se coloca un enlace en “.” (el nivel principal) para que se dispare sin importar el enfoque:

 >>> from Tkinter import * >>> root=Tk() >>> e1=Entry(root) >>> e1.pack() >>> e2=Entry(root) >>> e2.pack() >>> def handleReturn(event): ... print "return: event.widget is",event.widget ... print "focus is:",root.focus_get() ... >>> root.bind("",handleReturn) 

Observe la diferencia entre los dos: en el primer ejemplo, solo se llamará al controlador cuando se presiona regresar en el widget de la primera entrada. No hay necesidad de comprobar qué widget tiene foco. En el segundo ejemplo, se llamará al manejador sin importar qué widget tenga el foco.

Ambas soluciones son buenas dependiendo de lo que realmente necesita que suceda. Si su objective principal es solo hacer algo cuando el usuario presiona regresar en un widget específico, use el primero. Si desea un enlace global, pero en ese enlace haga algo diferente en función de lo que tiene o no tiene el enfoque, haga el último ejemplo.