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.

Cargando múltiples etiquetas móviles que muestran imágenes (Tkinter)

Quiero crear (en tiempo de ejecución) varios objetos de etiquetas móviles que muestren una imagen con Tkinter. El siguiente código funciona cuando la etiqueta no muestra una imagen, sino solo un color de fondo, por ejemplo. Sin embargo, cuando deseo cargar imágenes desde una lista de imágenes, solo se carga una etiqueta en lugar de todas las etiquetas que muestran todas las imágenes. No se produce ningún error ni se obtiene el resultado deseado.

images_files_list = self.get_images()

self.dynamic_labels = []

for image in images_files_list:
    self.img = ImageTk.PhotoImage(Image.open(images_path + image).resize((100, 100)))
    self.label = tk.Label(self, image=self.img, width=100, height=100)
    self.label.place(x=0, y=0)
    self.label.bind("<button-1>", drag_start)
    self.label.bind("<b1-motion>", drag_motion)
    self.dynamic_labels.append(self.label)

¿Qué estoy haciendo mal?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás colocando todas las etiquetas en la misma posición (x=0, y=0) utilizando el mismo punto de referencia. Por lo tanto, todas las etiquetas se están colocando una encima de la otra y solo se muestra la última etiqueta. Necesitas cambiar la posición de cada etiqueta para que no se superpongan.

    Una forma de hacer esto es utilizar una variable para llevar un registro de la posición de cada etiqueta e incrementarla después de colocar cada etiqueta. Por ejemplo, puedes establecer la posición inicial en (0, 0) y luego aumentar la coordenada x por el ancho de la etiqueta más un margen para crear una fila horizontal de etiquetas. También puedes pasar a la siguiente fila después de cierto número de etiquetas mediante el aumento de la coordenada y y restableciendo la coordenada x al valor inicial.

    Aquí tienes un ejemplo de fragmento de código que muestra cómo crear múltiples etiquetas móviles con imágenes utilizando Tkinter:

    images_files_list = self.get_images()
    self.dynamic_labels = []
    x, y = 0, 0
    label_width, label_height = 100, 100
    margin = 10
    num_labels_in_a_row = 4
    
    for i, image in enumerate(images_files_list):
        img = ImageTk.PhotoImage(Image.open(images_path + image).resize((label_width, label_height)))
        label = tk.Label(self, image=img, width=label_width, height=label_height)
        label.place(x=x, y=y)
        label.bind("<button-1>", drag_start)
        label.bind("<b1-motion>", drag_motion)
        self.dynamic_labels.append(label)
    
        x += label_width + margin
        if (i + 1) % num_labels_in_a_row == 0:
            x = 0
            y += label_height + margin
    

    En este ejemplo, establecemos la posición inicial en (0, 0) y creamos una fila horizontal de etiquetas con un margen de 10 píxeles. Después de colocar cada etiqueta, incrementamos la coordenada x por el ancho de la etiqueta más el margen. Si el número de etiquetas en una fila ha alcanzado el límite (4 en este ejemplo), pasamos a la siguiente fila restableciendo la coordenada x a 0 e incrementando la coordenada y por la altura de la etiqueta más el margen. Finalmente, agregamos cada etiqueta a una lista para poder acceder a ellas más tarde.

Comments are closed.