On 2020-11-10 10:01, ChalaoAdda wrote:
Hello,
I have a list of canvas of images. I would like to display all the images. But
it displays the last image. Here is my code.
from tkinter import *
from PIL import Image, ImageTk
root = Tk()
canvas_width = 265
canvas_height = 130
canvases = []
r, c = 0, 0
for tile in tiles:
img = tile.image
photo = ImageTk.PhotoImage(image=img)
can = Canvas(root, width=canvas_width, height=canvas_height)
can.create_image(0, 0, image=photo, anchor=NW)
canvases.append(can)
can.grid(row=r, column=c)
c += 1
if c % 5 == 0:
r += 1
c = 0
root.mainloop()
You need to keep a reference to the images. In your code, 'photo' still
refers to the last photoimage, so that's why it's displayed; there are
no references to the others, so they're garbage-collected. (You probably
expected that 'create_image' would keep a reference to the image, but it
doesn't. tkinter has its idiosyncrasies!)
Try adding a list for the photoimages:
...
photos = []
for tile in tiles:
img = tile.image
photo = ImageTk.PhotoImage(image=img)
photos.append(photo)
can = Canvas(root, width=canvas_width, height=canvas_height)
...
--
https://mail.python.org/mailman/listinfo/python-list