es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo obtener el objeto de la etiqueta a partir del número de identificación?

Me gustaría saber si hay una forma de obtener una etiqueta de un objeto de lienzo a partir de su ID.

He estado trabajando en un juego en el que necesito eliminar todos los elementos con la misma etiqueta, pero solo tengo uno de los ID de esos objetos. Ejemplo:

root = Tk()
canvas = Canvas(root, width = x, height = y)
collider_object = canvas.create_*(any)*(coordnates_x, coordinates_y)

for i in range(5):
    for j in range(5):
        object_one = canvas.create_*(any)*(coordinates_x1, coordinates_y1, tag = '%i%i'%(i,j))
        object_two = canvas.create_*(any)*(coordinates_x2, coordinates_y2, tag = '%i%i'%(i,j))        
        object_three = canvas.create_*(any)*(coordinates_x3, coordinates_y3, tag = '%i%i'%(i,j))

ID = canvas.find_overlapping(object_collider*(coordinates)*)

canvas.delete(ID['tag'])

IDLE response: TypeError: 'int' object is not subscriptable

Como puedes ver, los objetos tienen la misma etiqueta pero coordenadas diferentes, lo que significa que no necesariamente colisionarán al mismo tiempo con collider_object.

Necesito obtener la etiqueta a partir del número de ID, de esta manera podría eliminar todos los objetos cuando alguno de ellos con la misma etiqueta colisione con collider_object.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes utilizar el método gettags() del objeto Canvas para recuperar las etiquetas asociadas a un objeto de lienzo utilizando su ID. Aquí tienes un fragmento de código actualizado:

    root = Tk()
    canvas = Canvas(root, width=x, height=y)
    collider_object = canvas.create_*(cualquier cosa)*(coordenada_x, coordenada_y)
    
    for i in range(5):
        for j in range(5):
            objeto_uno = canvas.create_*(cualquier cosa)*(coordenada_x1, coordenada_y1, tag='%i%i'%(i,j))
            objeto_dos = canvas.create_*(cualquier cosa)*(coordenada_x2, coordenada_y2, tag='%i%i'%(i,j))    
            objeto_tres = canvas.create_*(cualquier cosa)*(coordenada_x3, coordenada_y3, tag='%i%i'%(i,j))
    
    ID = canvas.find_overlapping(objeto_colisionador*(coordenadas)*)
    
    for id in ID:
        etiquetas = canvas.gettags(id)
        for etiqueta in etiquetas:
            if etiqueta.isnumeric():
                canvas.delete(etiqueta)
    

    En este código actualizado, utilizamos un bucle anidado para crear los objetos con las mismas etiquetas que antes. Luego encontramos los objetos que se superponen utilizando canvas.find_overlapping() e iteramos a través de cada id devuelto. Luego utilizamos canvas.gettags(id) para obtener las etiquetas asociadas a cada objeto e iteramos a través de ellas. Si la etiqueta es numérica (indicando que es una de las etiquetas que asignamos a nuestros objetos), eliminamos todos los objetos con esa etiqueta utilizando canvas.delete(etiqueta).

Comments are closed.