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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top