Come si fa a controllare se un widget attivo in Tkinter?

from Tkinter import *

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

Voglio essere in grado di controllare se text_field attualmente selezionata o concentrati, in modo che io possa sapere se o non fare qualcosa con il suo contenuto quando l’utente preme invio.

InformationsquelleAutor cstack | 2009-09-06

 

One Reply
  1. 20

    Se si vuole fare qualcosa quando l’utente preme invio solo se il focus è sul widget di inserimento, è sufficiente aggiungere un’associazione per la voce widget. Sarà solo il fuoco se che widget è attivo. Per esempio:

    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)

    Notare che il gestore è chiamato solo se la prima voce ha la messa a fuoco quando si preme invio.

    Se si vuole veramente globale vincolante e hanno bisogno di sapere che widget è attivo, utilizzare il focus_get() metodo sull’oggetto radice. Nell’esempio riportato di seguito un’associazione è mettere su “.” (il protagonista principale), in modo che gli incendi non importa che cosa ha di messa a fuoco:

    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)

    Notare la differenza tra i due: nel primo esempio, il gestore potrà essere chiamato solo quando si preme il ritorno in prima voce widget. Non c’è bisogno di controllare che widget è attivo. Nel secondo esempio, il gestore sarà chiamato non importa che widget è attivo.

    Entrambe le soluzioni sono buone, a seconda di che cosa si ha realmente bisogno per avere successo. Se il tuo obiettivo è solo fare qualcosa quando l’utente preme il ritorno in un widget specifico, l’uso del precedente. Se si desidera un globale vincolante, ma che l’associazione fare qualcosa di diverso, basato su ciò che è o non è attivo, fare l’ultimo esempio.

    • Questa cosa è possibile, ma senza attendere l’invio per essere premuto. Per esempio, quando l’utente seleziona la Voce per scrivere qualcosa, è possibile sapere che cosa è successo?
    • sì, è possibile.
    • Come fare? 😀 Dove potrei trovare?
    • si imposta un’associazione <FocusIn>.

Lascia un commento