在循环中使用tkinter图像画布



我最近开始研究tkinter,并决定拿起这个破块游戏来研究/修改它。

因此问题出现在以下几行:

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

我想有多个图像块,但它只给我一个块&其他块不可见,但仍然可用(球反弹回来)。

我该如何解决这个问题?

这是用于比较的原始代码:(这张效果很好,但它使用了一个矩形画布。)

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个副本。只需在进入循环之前加载一次,然后反复使用。

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

最新更新