Como você verifica se um widget tem foco no tknter?
-
21-09-2019 - |
Pergunta
from Tkinter import *
app = Tk()
text_field = Entry(app)
text_field.pack()
app.mainloop()
Eu quero poder verificar se text_field
está atualmente selecionado ou focado, para que eu saiba se deve ou não fazer algo com seu conteúdo quando o usuário pressiona Enter.
Solução
Se você quiser fazer algo quando o usuário pressiona, entre apenas se o foco estiver no widget de entrada, basta adicionar uma ligação ao widget de entrada. Só disparará se esse widget tiver foco. Por exemplo:
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)
Observe que o manipulador é chamado apenas se a primeira entrada tiver foco quando você pressionar o retorno.
Se você realmente deseja uma ligação global e precisa saber qual widget tem foco, use o método focus_get () no objeto raiz. No exemplo seguinte, uma ligação é colocada "". (o principal principal) para que ele dispare, não importa o que tenha foco:
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)
Observe a diferença entre os dois: no primeiro exemplo, o manipulador só será chamado quando você pressionar o retorno no primeiro widget de entrada. Não há necessidade de verificar qual widget tem foco. No segundo exemplo, o manipulador será chamado, não importa qual widget tenha foco.
Ambas as soluções são boas, dependendo do que você realmente precisa ter acontecido. Se seu principal objetivo é fazer algo apenas quando o usuário pressionar retornar em um widget específico, use o primeiro. Se você deseja uma ligação global, mas nessa ligação faz algo diferente com base no que tem ou não foco, faça o último exemplo.