python - ventana - Cómo obtener el nombre del widget en el evento
cerrar ventana tkinter python (3)
from tkinter import *
main = Tk()
def flipper(event):
# I''d like to do this:
#if widgetname == switcher:
#do stuff
#if widgetname == switcher1:
#do stuff
return
switcher = Label(main, bg=''white'', text="click here", font="-weight bold")
switcher.grid()
switcher.bind("<Button-1>", flipper)
switcher1 = Label(main, bg=''white'', text="click here", font="-weight bold")
switcher1.grid()
switcher1.bind("<Button-1>", flipper)
switcher2 = Label(main, bg=''white'', text="click here", font="-weight bold")
switcher2.grid()
switcher2.bind("<Button-1>", flipper)
switcher3 = Label(main, bg=''white'', text="click here", font="-weight bold")
switcher3.grid()
switcher3.bind("<Button-1>", flipper)
switcher4 = Label(main, bg=''white'', text="click here", font="-weight bold")
switcher4.grid()
switcher4.bind("<Button-1>", flipper)
switcher5 = Label(main, bg=''white'', text="click here", font="-weight bold")
switcher5.grid()
switcher5.bind("<Button-1>", flipper)
main.mainloop()
En mi función de evento, me gustaría hacer diferentes cosas en función de la etiqueta en la que se hace clic. Lo que me sorprendió es que solo puedo obtener el número identificador del widget en el que se hace clic, no el nombre. Si pudiera obtener el identificador de todos mis widgets, entonces podría hacer:
def flipper(event):
if event.widget == switcher.identifier():
do stuff
pero tampoco puedo encontrar la forma de obtener la identificación de un widget específico ...
¿Cómo puedo obtener el nombre de un widget por su identificador (event.widget ())?
O ¿cómo puedo obtener el identificador de un nombre de widget especificado?
Si ninguno de los dos es posible, tendré que hacer una función diferente y unir para cada etiqueta, que es mucho trabajo que, afortunadamente, no es necesario.
editar:
from tkinter import *
main = Tk()
def flipper(event, switch):
if switch.widget == ''s1'':
print("got it")
switcher = Label(main, bg=''white'', text="click here", font="-weight bold")
switcher.grid()
switcher.bind("<Button-1>", flipper)
switcher.widget = ''s1''
main.mainloop()
No puede obtener el nombre de variable al que está asignado el widget, que sería relativamente inútil. Un widget podría asignarse a más de una variable, o ninguna en absoluto.
Obtener el texto de la etiqueta
Usted tiene acceso al widget real y puede usarlo para obtener el texto que está en la etiqueta. Tu ejemplo muestra que todas las etiquetas son iguales, por lo que puede que no te sea útil:
def flipper(event):
print("label text:", event.widget.cget("text"))
Usar un nombre de widget personalizado
También puede darle un nombre a un widget. No puedes recuperar exactamente el nombre, pero puedes acercarte mucho. Por ejemplo, si crea una etiqueta como esta:
switcher = Label(main, name="switcher", bg=''white'', text="click here", font="-weight bold")
Puede obtener la representación de cadena del widget dividiendo en "." y tomando el último valor:
def flipper(event):
print("widget name:", str(event.widget).split(".")[-1])
Pasar un nombre a través del enlace
Finalmente, puede configurar sus enlaces de manera que el nombre se envíe a la función:
switcher.bind("<Button-1>", lambda event: flipper(event, "switcher"))
switcher1.bind("<Button-1>", lambda event: flipper(event, "switcher1"))
Puede usar event.widget
para obtener los parámetros estándar del widget event.widget
ejemplo:
import tkinter as tk
def callback(event):
print(event.widget[''text''])
main = tk.Tk()
switcher = tk.Label(main, text="click here")
switcher.grid()
switcher.bind("<Button-1>", callback)
main.mainloop()
Puede asignar sus propias variables a los widgets
switcher.extra = "Hello"
y luego entiéndelo
event.widget.extra
ejemplo:
import tkinter as tk
def callback(event):
print(event.widget[''text''])
print(event.widget.extra)
main = tk.Tk()
switcher = tk.Label(main, text="click here")
switcher.grid()
switcher.bind("<Button-1>", callback)
switcher.extra = "Hello"
main.mainloop()
Puede usar lambda
para vincular la función con argumentos
bind("<Button-1>", lambda event:callback(event, "Hello"))
ejemplo:
import tkinter as tk
def callback(event, extra):
print(event.widget[''text''])
print(extra)
main = tk.Tk()
switcher = tk.Label(main, text="click here")
switcher.grid()
switcher.bind("<Button-1>", lambda event:callback(event, "Hello"))
main.mainloop()
Rápido y sucio: puede hacer que la función compruebe un atributo del conmutador.
def flipper(event, switch):
if switch.widget == ''s1'':
do_stuff
return stuff
if switch.widget == ''s2'':
do_stuff
return stuff
switcher1.widget = ''s1''
switcher2.widget = ''s2''