Как проверить, имеет ли виджет фокус в Tkinter?

from Tkinter import *

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

Я хочу иметь возможность проверить, если text_field в настоящее время выбран или сфокусирован, так что я знаю, делать ли что-то с его содержимым, когда пользователь нажимает enter.

1 ответов


Если вы хотите что-то сделать, когда пользователь нажимает enter, только если фокус находится на виджете ввода, просто добавьте привязку к виджету ввода. Он будет срабатывать, только если этот виджет имеет фокус. Например:

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

обратите внимание, что обработчик вызывается, только если первая запись имеет фокус при нажатии кнопки return.

Если вы действительно хотите глобальную привязку и должны знать, какой виджет имеет фокус, используйте метод focus_get() для корневого объекта. В следующем примере привязка надевается "."(главный верхний уровень) так, что он срабатывает независимо от того, что имеет фокус:

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

обратите внимание на разницу между ними: в первом примере обработчик будет вызываться только при нажатии кнопки return в первом виджете ввода. Нет необходимости проверять, какой виджет имеет фокус. Во втором примере обработчик будет вызываться независимо от того, какой виджет имеет фокус.

оба варианта хороши в зависимости от того, что вам действительно нужно. Если ваша главная цель чтобы сделать что-то только тогда, когда пользователь нажимает return в определенном виджете, используйте первый. Если вы хотите глобальную привязку, но в этой привязке сделайте что-то другое на основе того, что имеет или не имеет фокус, сделайте последний пример.