gui examples example python events user-interface click tkinter

examples - tkinter python



Cómo obtener la etiqueta de una forma cuando se hace clic (2)

Digamos que he creado un lienzo en una aplicación Tkinter.

En el lienzo, he dibujado varios rectángulos.

Lo que quiero en esencia es saber en qué rectángulo ha hecho clic el usuario, esa es mi principal preocupación, pero esto es lo que he intentado y creo que podría ser la solución.

Este es mi diseño:

for x in range(1,6): for y in range(1,7): tableNumber = y + 6*(x-1) w.create_rectangle((table.xSeparation + table.width) * y - table.width, (table.ySeparation + table.height) * x - table.height, (table.xSeparation + table.width)*y, (table.ySeparation + table.height) * x, fill="brown", tags="table" + str(tableNumber)) w.tag_bind("table" + str(tableNumber), ''<Button-1>'', do)

Así que esto solo crea rectángulos en un diseño de filas y columnas.

Cada rectángulo tiene una etiqueta específica en forma de table2 , table2 a table30 .

Cuando hago clic en el rectángulo, la función do ejecuta.

Digamos que fue algo así como:

def do(event): print "click"

No recibo un "clic" en la consola por cada clic en el rectángulo.

Me gustaría poder obtener la etiqueta del rectángulo cliqueado para poder hacer algo como esto:

def do(event): print str(theTagOfTheClickedRectangle)

Así que revisé qué eventos puedo llamar que son:

  • widget
  • x, y
  • x_root, y_root
  • carbonizarse
  • keysym
  • clave
  • número
  • ancho, altura
  • tipo

Ninguno de los puntos parece apuntar en qué rectángulo he hecho clic.

Pensé en agregar más parámetros a la función do aquí:

w.tag_bind("table" + str(tableNumber), ''<Button-1>'', do(event, tag))

Pero eso no parece funcionar bien, pero tal vez no estoy haciendo do correcto:

do(event, tag): #this doesn''t work at all!! print event.x print tag

Espero que la pregunta sea clara, si obtuve la etiqueta de la misma manera que puedo obtener la ''x'' e ''y'' del evento, eso sería muy cómodo.

La única solución real en la que ahora puedo pensar es calcular los cálculos de ''event.x'' y ''event.y'' y calcular, basándose en las coordenadas del clic, en qué rectángulo ha hecho clic el usuario, esto parece demasiado complicado para lo que estoy tratando de hacer, aunque lo he hecho antes y obviamente funciona.

Espero que la pregunta sea clara, de lo contrario, solicite cualquier aclaración.

Tenga en cuenta que no estoy vinculado a ninguno de estos códigos, más bien, estoy buscando una solución para este problema, el más eficiente funcionará incluso si significa no trabajar con etiquetas, u otro tipo de widget o lo que sea más fácil.


Puede usar algo como esto para hacer referencia al objeto cliqueado:

event.widget.find_withtag("current")

La etiqueta "actual" es especial y representa el objeto más alto debajo del mouse.


w.tag_bind("table" + str(tableNumber), ''<Button-1>'', do(event, tag))

debe cambiarse a

tag = "table" + str(tableNumber) callback = lambda event, tag=tag: do(event, tag) w.tag_bind(tag, ''<Button-1>'', callback)

La lambda crea una función con el nombre de la etiqueta como el valor predeterminado del segundo argumento. Tkinter llama a esa función con solo un argumento, el evento y el segundo argumento usa el valor predeterminado.