Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: cstackОтветов: 1
from Tkinter import *

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

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

pythonfocustkintertkinter-entry

Ответы

Ответ 1 · рейтинг 23 · Bryan Oakley

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы