如何使用多个对象?

时间:2018-04-25 15:18:15

标签: python python-3.x tkinter

所以我使用tkinter来生成一个迷宫,但问题是我在墙上使用了块,我仍然是python的初学者所以我不知道我应该怎么做,这里是问题 : 我使用了一个块block = PhotoImage(file ='images/block.ppm')

block0 = Label(root, image=block)
block1 = Label(root, image=block)
...

我用一个脚本给我写了425个对象并用block0.place(x=20, y=20)将它们放在不同的地方,我知道它很愚蠢但我不知道该怎么办,它给我打印了迷宫,但是当我想要的时候用命令root.destroy关闭 我做不到。我想这是因为我做了这个愚蠢的事情。 那我该怎么做呢? 我试图了解更多关于课程的知识,但它也没有奏效。 这是我的代码https://mega.nz/#F!Z7xB2IJK!NSSLM6rRFJDE5kpMPs6W_Q 提前致谢

1 个答案:

答案 0 :(得分:1)

我花了很长时间才弄明白你想做什么。如果您还没有找到问题的解决方案,可以尝试以下代码。

你应该做的第一件事是声明一个全局变量来存储所有迷宫块。

blocks = [] # create a list for the maze blocks

然后我们需要建立和摧毁迷宫的功能。您的代码示例(destroythemhehemazebuilder)中已经有类似的结构,但我们可以在这里大大提高可读性和性能。

def gamephase():
    global menu, quit, block
    menu = Button(root, text='Menu', relief=RIDGE, bg='#C90', command=menuevent)
    menu.place(x=50, y=540)
    quit = Button(root, text='Quitter', relief=RIDGE, bg='#C90', command=destroy_maze)
    quit.place(x=670, y=540)
    generate = Button(root, text='Generer', relief=RIDGE, bg='#C90', command=build_maze)
    generate.place(x=360, y=540)

构建迷宫的功能并不复杂:

def build_maze():
    global blocks
    for x in range(17):
        for y in range(25):
            if zone[x][y]:
                b = Label(root, image=block)
                b.place(x=20 + y * 30, y=20 + x * 30) # a formula which calculates the position of the block
                blocks.append(b) # add the block to the list

它与您的函数mazebuilder基本相同,但它将所有Label保存到blocks列表中,该列表比blocker函数更清晰。现在我们需要一个破坏块的函数:

def destroy_maze():
    global blocks
    for x in blocks: # destroy each block
        x.destroy()
    blocks = []

我们完成了!这应该按预期工作,但我没有彻底测试过。

如果使用类而不是全局变量,则可以使代码更漂亮。这也可以帮助你防止一些讨厌的错误。