Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top