Как проверить, имеет ли виджет фокус в Tkinter?
-
21-09-2019 - |
Вопрос
from Tkinter import *
app = Tk()
text_field = Entry(app)
text_field.pack()
app.mainloop()
Я хочу иметь возможность проверить, если text_field
в настоящее время выбран или сфокусирован, так что я знаю, нужно ли что-то делать с его содержимым, когда пользователь нажимает Enter.
Решение
Если вы хотите что-то сделать, когда пользователь нажимает Enter, только если фокус находится на виджете входа, просто добавьте привязку к виджету входа.Он сработает только в том случае, если этот виджет имеет фокус.Например:
import tkinter as tk
root = tk.Tk()
e1 = tk.Entry(root)
e2 = tk.Entry(root)
e1.pack()
e2.pack()
def handleReturn(event):
print("return: event.widget is",event.widget)
print("focus is:", root.focus_get())
e1.bind("<Return>", handleReturn)
Обратите внимание, что обработчик вызывается только в том случае, если первая запись имеет фокус при нажатии клавиши возврата.
Если вам действительно нужна глобальная привязка и вам нужно знать, какой виджет имеет фокус, используйте метод focus_get() для корневого объекта.В следующем примере привязка установлена "." (Основной топлеров
import tkinter as tk
root = tk.Tk()
e1 = tk.Entry(root)
e2 = tk.Entry(root)
e1.pack()
e2.pack()
def handleReturn(event):
print("return: event.widget is",event.widget)
print("focus is:",root.focus_get())
root.bind("<Return>", handleReturn)
Обратите внимание на разницу между ними:в первом примере обработчик будет вызываться только тогда, когда вы нажмете клавишу возврата в первом виджете ввода.Нет необходимости проверять, какой виджет находится в фокусе.Во втором примере обработчик будет вызываться независимо от того, какой виджет находится в фокусе.
Оба решения хороши в зависимости от того, что вам действительно нужно.Если ваша главная цель — делать что-то только тогда, когда пользователь нажимает клавишу «Return» в определенном виджете, используйте первый вариант.Если вам нужна глобальная привязка, но в этой привязке вы делаете что-то другое в зависимости от того, что имеет или не имеет фокуса, выполните последний пример.