在循环中使用tkinter图片画布吗?

问题描述 投票:2回答:1

我最近开始研究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
python canvas tkinter tags ttk
1个回答
1
投票

正如@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
© www.soinside.com 2019 - 2024. All rights reserved.