为什么多个 tkinter canvas 图像只显示一次?

Why are multiple tkinter canvas images only showing once?

所以我有一个循环可以在 canvas 上制作多个 canvas 图像。
但是当我 运行 我的代码时,只出现一张图片。
(假设 window 已设置为 root 并且 PIL 已导入)

 1 x,y = 0
 2 tiles = []
 3 tilesize = 32
 4 gridwidth = 10
 5 gridheight = 10
 3 canvas=Canvas(root, width=500, height=500, bg="#800000")
 4 for i in tiles:
 5         image = PIL.ImageTk.PhotoImage(PIL.Image.open("tile.png").resize((tilesize, tilesize), PIL.Image.ANTIALIAS))
 6         tiles.append(canvas.create_image(x*tilesize, y*tilesize, image=image, anchor=NW))
 7         x+=1
 8         if x%gridwidth == 0:
 9                 y+=1
10                 x=0
11         if y == gridheight+1:
12                 # Do some error handling stuff

If 在此之后如果我添加 print(tiles) 我会看到一个递增值列表,这是应该的。例如:

[1, 2, 3, 4, 5...98, 99, 100]

如果我运行这个:

13 test=[]
14 for i in tiles:
15         test.append(canvas.coords(i))
16 print(test)

我看到所有的图块都有不同的坐标,但它们都显示为一个图像。 我的预期输出是它们显示为网格,但这并没有发生。 为什么会出现这种情况,有什么解决办法吗? 不,grid 函数对我当前的上下文没有帮助。

由于您对 for 循环中创建的所有图像使用相同的变量 image,因此只有最后一张图像被 image 引用,之前的图像将被垃圾收集。

使用列表存储图像实例:

...
from PIL import Image, ImageTk
...
imagelist = []
for i in range(gridwidth*gridheight):
    y, x = divmod(i, gridwidth)
    image = ImageTk.PhotoImage(Image.open("tile.png").resize((tilesize, tilesize), Image.ANTIALIAS))
    tiles.append(canvas.create_image(x*tilesize, y*tilesize, image=image, anchor=NW))
    imagelist.append(image) # save the image reference
...