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

from Tkinter import *

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

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


person cstack    schedule 06.09.2009    source источник


Ответы (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)

root.mainloop()

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

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

root.mainloop()

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

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

person Bryan Oakley    schedule 06.09.2009
comment
Возможно ли это, но не дожидаясь нажатия кнопки ввода. Например, когда пользователь просто выбирает «Ввод», чтобы что-то ввести, можно ли узнать, что это произошло? - person Muhamed Huseinbašić; 04.01.2015
comment
@MuhamedHuseinbašić: да, это возможно. - person Bryan Oakley; 05.01.2015
comment
Как это сделать? :D Где я мог найти это? - person Muhamed Huseinbašić; 05.01.2015
comment
@MuhamedHuseinbašić: вы установили привязку к <FocusIn>. - person Bryan Oakley; 05.01.2015
comment
На этой странице объясняется, что делает каждая возможная привязка. - person Nicolas Abril; 03.02.2020