在循环中使用 tkinter 图像 canvas?
Using a tkinter image canvas in a loop?
我最近开始研究 tkinter
并决定选择这款破方块游戏 study/modify 它。
所以问题出现在以下几行:
blocks = []
block.xLoc = 50
block.yLoc = 50
block.xsize = 40
block.ysize = 30
for x in range(4):
for y in range(20):
blockC = PhotoImage(file = "block.png")
blockID = canvas.create_image(block.xLoc,block.yLoc,image=blockC)
canvas.grid()
blocks.append(blockID)
block.xLoc += 40
block.yLoc += 30
block.xLoc = 50
我想要多个图像块,但它只给我一个块
& 其他方块不可见但仍然可用(球弹回)。
我该如何解决这个问题?
这是对比的原代码:
(这个工作完美,但它使用的是矩形 canvas。)
blocks = []
block.xLoc = 50
block.yLoc = 50
block.xsize = 40
block.ysize = 30
for x in range(4):
for y in range(20):
blockID = canvas.create_rectangle([block.xLoc, block.yLoc,
block.xLoc+block.xsize,
block.yLoc+block.ysize],
fill="white")
canvas.grid()
blocks.append(blockID)
block.xLoc += 40
block.yLoc += 30
block.xLoc = 50
正如@Bryan Oakley 指出的那样,您需要保留对循环中某处创建的 PhotoImage
对象的引用,这样一旦您将新值放入临时 blockC
最内层循环中使用的变量。
很难从你问题中的代码片段中判断出来,但像下面这样的东西应该可以解决问题。由于所有块的图像都是相同的,因此没有理由在内部循环本身中加载它的 80 个副本。进入循环之前加载一次就可以使用了over-and-over.
blocks = []
block.xLoc = 50
block.yLoc = 50
block.xsize = 40
block.ysize = 30
blockC = PhotoImage(file="block.png") # moved outside loop
for x in range(4):
for y in range(20):
blockID = canvas.create_image(block.xLoc, block.yLoc, image=blockC)
canvas.grid()
blocks.append(blockID)
block.xLoc += 40
block.yLoc += 30
block.xLoc = 50
我最近开始研究 tkinter
并决定选择这款破方块游戏 study/modify 它。
所以问题出现在以下几行:
blocks = []
block.xLoc = 50
block.yLoc = 50
block.xsize = 40
block.ysize = 30
for x in range(4):
for y in range(20):
blockC = PhotoImage(file = "block.png")
blockID = canvas.create_image(block.xLoc,block.yLoc,image=blockC)
canvas.grid()
blocks.append(blockID)
block.xLoc += 40
block.yLoc += 30
block.xLoc = 50
我想要多个图像块,但它只给我一个块 & 其他方块不可见但仍然可用(球弹回)。
我该如何解决这个问题?
这是对比的原代码: (这个工作完美,但它使用的是矩形 canvas。)
blocks = []
block.xLoc = 50
block.yLoc = 50
block.xsize = 40
block.ysize = 30
for x in range(4):
for y in range(20):
blockID = canvas.create_rectangle([block.xLoc, block.yLoc,
block.xLoc+block.xsize,
block.yLoc+block.ysize],
fill="white")
canvas.grid()
blocks.append(blockID)
block.xLoc += 40
block.yLoc += 30
block.xLoc = 50
正如@Bryan Oakley 指出的那样,您需要保留对循环中某处创建的 PhotoImage
对象的引用,这样一旦您将新值放入临时 blockC
最内层循环中使用的变量。
很难从你问题中的代码片段中判断出来,但像下面这样的东西应该可以解决问题。由于所有块的图像都是相同的,因此没有理由在内部循环本身中加载它的 80 个副本。进入循环之前加载一次就可以使用了over-and-over.
blocks = []
block.xLoc = 50
block.yLoc = 50
block.xsize = 40
block.ysize = 30
blockC = PhotoImage(file="block.png") # moved outside loop
for x in range(4):
for y in range(20):
blockID = canvas.create_image(block.xLoc, block.yLoc, image=blockC)
canvas.grid()
blocks.append(blockID)
block.xLoc += 40
block.yLoc += 30
block.xLoc = 50