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

from Tkinter import *

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

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

Ответ 1

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

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)

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

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