ventanas ventana cerrar botones python python-3.x tkinter widget

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''