Как проверить, имеет ли виджет фокус в 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 в определенном виджете, используйте первый. Если вы хотите глобальную привязку, но в этой привязке сделайте что-то другое на основе того, что имеет или не имеет фокус, сделайте последний пример.