2009-09-06 161 views
9
from Tkinter import * 

app = Tk() 
text_field = Entry(app) 
text_field.pack() 
app.mainloop() 

Quiero poder comprobar si text_field está actualmente seleccionado o enfocado, de modo que sé si hacer o no algo con sus contenidos cuando el usuario presione enter.¿Cómo verifica si un widget tiene foco en Tkinter?

Respuesta

16

Si usted quiere hacer algo cuando el usuario pulsa Intro sólo si el foco está en el widget de entrada, basta con agregar un enlace al widget de entrada. Solo se activará 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("<Return>", handleReturn) 

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

Si realmente desea una unión global y necesita saber qué control tiene el foco, utilizar el método focus_get() en el objeto raíz. En el siguiente ejemplo, se pone un enlace "." (El nivel superior principal) forma que se dispare sin importar lo que tiene el foco:

>>> 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("<Return>",handleReturn) 

cuenta de la diferencia entre los dos: en el primer ejemplo, el controlador sólo se llamará cuando se pulsa el retorno en el primer widget de entrada. No es necesario verificar qué widget tiene foco. En el segundo ejemplo, se llamará al controlador sin importar qué widget tenga foco.

Ambas soluciones son buenos dependiendo de lo que realmente se necesita que suceda. Si su objetivo 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 foco, haga el último ejemplo.

+0

es esta cosa sea posible, pero sin esperar a que se oprima Enter. Por ejemplo, cuando el usuario simplemente selecciona Entrada para escribir algo, ¿es posible saber que eso sucedió? –

+1

@ MuhamedHuseinbašić: sí, es posible. –

+0

¿Cómo hacer eso? : D ¿Dónde podría encontrar eso? –

Cuestiones relacionadas