为什么多个 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
...
所以我有一个循环可以在 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
...