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.

Python tkinter con canvas no muestra imágenes.

Tengo problemas con “tkinter” y “canvas” cuando recuperar imágenes de la base de datos y renderizar todas las imágenes no se muestran. Al depurar el código, todas las imágenes se muestran normalmente, pero al ejecutar el código las imágenes no se muestran en el canvas.

count = 0
posx = 1
posy = 5
for imagem in self.imagens:

    img1 = Image.open(imagem[2])
    img1 = img1.resize((200, 200), Image.ANTIALIAS)
    photoImage = ImageTk.PhotoImage(img1)

    self.canvas.create_image(posy, posx, anchor=NW, image=photoImage)

    count = count + 1
    if count == 9:
        break

    if count == 0 or count == 3 or count == 6:
        posy = 5
    elif count == 1 or count == 4 or count == 7:
        posy = 210
    elif count == 2 or count == 5 or count == 8:
        posy = 415

    if count > 2 and count < 5:
        posx = 205
    elif count > 5 and count < 8:
        posx = 410
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar relacionado con el alcance del objeto PhotoImage. Al crear un objeto PhotoImage en tkinter, debe asignarse a una variable con alcance global, de lo contrario, puede ser recolectado por el recolector de basura y no aparecer en el lienzo.

    Una solución para esto podría ser almacenar todos los objetos PhotoImage en una lista con alcance global y referirse a esa lista al crear imágenes en el lienzo. Por ejemplo:

    photo_images = []
    
    ...
    
    for imagem in self.imagens:
        img1 = Image.open(imagem[2])
        img1 = img1.resize((200, 200), Image.ANTIALIAS)
        photoImage = ImageTk.PhotoImage(img1)
        photo_images.append(photoImage)
    
    ...
    
    for i, photoImage in enumerate(photo_images):
        self.canvas.create_image(posy, posx, anchor=NW, image=photoImage)
    
        # código de cálculo de posición aquí
    
    

    Otra cosa a comprobar es si las imágenes se están recuperando correctamente de la base de datos, se puede comprobar imprimiendo los nombres de los archivos de imagen o verificando si existen en el sistema de archivos.

    Además, si el lienzo no se está actualizando o dibujando correctamente, es posible que deba llamar los métodos update() o update_idletasks() en el lienzo después de crear las imágenes.

    ¡Espero que esto ayude!

Comments are closed.