Tkinter List of Canvases
ChalaoAdda
chalao.adda at gmail.com
Wed Nov 11 00:12:21 EST 2020
On Tue, 10 Nov 2020 17:21:04 +0000, MRAB wrote:
> 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)
> ...
Thanks a lot.
More information about the Python-list
mailing list