tkinter 窗口未按预期销毁

时间:2021-06-09 03:29:21

标签: python tkinter

我使用 tkinter 编写了一个非常简单的扫雷器克隆,但是由于某种原因,当我调用 boom() 方法时,会打印 "BOOM!" 但窗口没有关闭。为什么这不起作用?

import math
import tkinter
from tkinter import *
from random import sample, randrange

# ??

revealed = []
firstClick = True

def boom():
    print("BOOM!")
    root.destroy()

def flag(x, y):
    if [x,y] not in revealed:
        if (textArray[x][y].get() == "?"):
            textArray[x][y].set("")
        else:
            labelArray[x][y].configure(fg="red", font="Arial 12")
            textArray[x][y].set("?")

def reveal(x, y, active):
    global firstClick
    if firstClick:
        firstClick = False
        randx = randrange(len(gameMap))
        randy = randrange(len(gameMap))

        while(gameMap[randx][randy] != 0):
            randx = randrange(len(gameMap))
            randy = randrange(len(gameMap))

        reveal(randx, randy, False)
        return

    preRevealed = revealed.copy() 
    revealed.append([x, y])
    if gameMap[x][y] == "bomb":
        textArray[x][y].set("?")
        labelArray[x][y].configure(relief=FLAT, font=("Arial", 12), fg='red')
        print("BOOM!")
    elif gameMap[x][y] != 0:
        textArray[x][y].set(gameMap[x][y])
        if gameMap[x][y] == 1:
            labelArray[x][y].configure(fg="blue")
        if gameMap[x][y] == 2:
            labelArray[x][y].configure(fg="green")
        if gameMap[x][y] == 3:
            labelArray[x][y].configure(fg="red")
        if gameMap[x][y] == 4:
            labelArray[x][y].configure(fg="purple")
        if gameMap[x][y] >= 5:
            labelArray[x][y].configure(fg="orange")
        labelArray[x][y].configure(relief=FLAT, font=("Arial", 12, "bold"))
        if active:
            if [x,y] not in preRevealed:
                if gameMap[x][y] != "bomb":
                    if (x>0) and gameMap[x-1][y] != "bomb": reveal(x-1, y, False)
                    if (x<len(gameMap[x])-1) and gameMap[x+1][y] != "bomb": reveal(x+1, y, False)
                    if (y>0) and gameMap[x][y-1] != "bomb": reveal(x, y-1, False)
                    if (y<len(gameMap[x])-1) and gameMap[x][y+1] != "bomb": reveal(x, y+1, False)

                    if (y>0) and (x>0)and gameMap[x-1][y-1] != "bomb" and gameMap[x-1][y-1] != 0: reveal(x-1, y-1, False)
                    if (y<len(gameMap[x])-1) and (x>0)and gameMap[x-1][y+1] != "bomb" and gameMap[x-1][y+1] != 0: reveal(x-1, y+1, False)
                    if (y>0) and (x<len(gameMap[x])-1)and gameMap[x+1][y-1] != "bomb" and gameMap[x+1][y-1] != 0: reveal(x+1, y-1, False)
                    if (y<len(gameMap[x])-1) and (x<len(gameMap[x])-1)and gameMap[x+1][y+1] != "bomb" and gameMap[x-1][y+1] != 0: reveal(x+1, y+1, False)
    else:
        labelArray[x][y].configure(relief=FLAT)
        textArray[x][y].set("")
        if [x,y] not in preRevealed:
            if gameMap[x][y] != "bomb":
                if (x>0) and gameMap[x-1][y] != "bomb": reveal(x-1, y, True)
                if (x<len(gameMap[x])-1) and gameMap[x+1][y] != "bomb": reveal(x+1, y, True)
                if (y>0) and gameMap[x][y-1] != "bomb": reveal(x, y-1, True)
                if (y<len(gameMap[x])-1) and gameMap[x][y+1] != "bomb": reveal(x, y+1, True)

                if (y>0) and (x>0)and gameMap[x-1][y-1] != "bomb" and gameMap[x-1][y-1] != 0: reveal(x-1, y-1, True)
                if (y<len(gameMap[x])-1) and (x>0)and gameMap[x-1][y+1] != "bomb" and gameMap[x-1][y+1] != 0: reveal(x-1, y+1, True)
                if (y>0) and (x<len(gameMap[x])-1)and gameMap[x+1][y-1] != "bomb" and gameMap[x+1][y-1] != 0: reveal(x+1, y-1, True)
                if (y<len(gameMap[x])-1) and (x<len(gameMap[x])-1)and gameMap[x+1][y+1] != "bomb" and gameMap[x-1][y+1] != 0: reveal(x+1, y+1, True)

def playGame(gameframe, size):
    global gameMap
    global textArray
    global labelArray

    bombQuantity = math.ceil((size**2)*.15)

    bombPositions = sample(range(size**2), bombQuantity)
    gameMap = []
    textArray = []
    labelArray = []

    count = 0
    for r in range(size):
        textRow = []
        labelRow = []
        gameRow = []
        for c in range(size):
            text = StringVar()

            label = Label(gameframe, textvariable=text, height=1, width=2, font=("Arial", 12, "bold"), relief=RAISED, bg='#c0bfc0')

            if count in bombPositions:
                gameRow.append("bomb")
            else:
                gameRow.append(0)
                
            label.grid(row=r, column=c, padx = 1, pady=1)

            textRow.append(text)
            labelRow.append(label)            
            count+=1

        gameMap.append(gameRow)
        textArray.append(textRow)
        labelArray.append(labelRow)

    for row in range(len(gameMap)):
        for col in range(len(gameMap[row])):
            space = gameMap[row][col]

            labelArray[row][col].bind("<Button-1>", lambda event, x=row, y=col: reveal(x, y, False))
            labelArray[row][col].bind("<Button-2>", lambda event, x=row, y=col: flag(x, y))
            labelArray[row][col].bind("<Button-3>", lambda event, x=row, y=col: flag(x, y))

            if space == "bomb":
                for x in range(row-1, row+2):
                    for y in range(col-1, col+2):
                        if -1 < x < len(gameMap) and -1 < y < len(gameMap[row]) and gameMap[x][y] != "bomb":
                            gameMap[x][y]+=1

    
    # for row in gameMap:
    #     for col in gameMap:
    #         print(col, end =" ,") 
    #     print()


root = tkinter.Tk()

gameframe = Frame(root, bd=2, padx=2, pady=2, relief=SUNKEN, bg="#81828d")
gameframe.pack(side=BOTTOM, padx=30, pady=30)

playGame(gameframe, 15)

root.mainloop()

1 个答案:

答案 0 :(得分:0)

您从未调用过 boom 函数。这就是问题所在。

def reveal(x, y, active):
    global firstClick
    if firstClick:
        firstClick = False
        randx = randrange(len(gameMap))
        randy = randrange(len(gameMap))

        while(gameMap[randx][randy] != 0):
            randx = randrange(len(gameMap))
            randy = randrange(len(gameMap))

        reveal(randx, randy, False)
        return

    preRevealed = revealed.copy() 
    revealed.append([x, y])
    if gameMap[x][y] == "bomb":
        textArray[x][y].set("?")
        labelArray[x][y].configure(relief=FLAT, font=("Arial", 12), fg='red')
        boom()
    elif gameMap[x][y] != 0:
        textArray[x][y].set(gameMap[x][y])
        if gameMap[x][y] == 1:
            labelArray[x][y].configure(fg="blue")
        if gameMap[x][y] == 2:
            labelArray[x][y].configure(fg="green")
        if gameMap[x][y] == 3:
            labelArray[x][y].configure(fg="red")
        if gameMap[x][y] == 4:
            labelArray[x][y].configure(fg="purple")
        if gameMap[x][y] >= 5:
            labelArray[x][y].configure(fg="orange")
        labelArray[x][y].configure(relief=FLAT, font=("Arial", 12, "bold"))
        if active:
            if [x,y] not in preRevealed:
                if gameMap[x][y] != "bomb":
                    if (x>0) and gameMap[x-1][y] != "bomb": reveal(x-1, y, False)
                    if (x<len(gameMap[x])-1) and gameMap[x+1][y] != "bomb": reveal(x+1, y, False)
                    if (y>0) and gameMap[x][y-1] != "bomb": reveal(x, y-1, False)
                    if (y<len(gameMap[x])-1) and gameMap[x][y+1] != "bomb": reveal(x, y+1, False)

                    if (y>0) and (x>0)and gameMap[x-1][y-1] != "bomb" and gameMap[x-1][y-1] != 0: reveal(x-1, y-1, False)
                    if (y<len(gameMap[x])-1) and (x>0)and gameMap[x-1][y+1] != "bomb" and gameMap[x-1][y+1] != 0: reveal(x-1, y+1, False)
                    if (y>0) and (x<len(gameMap[x])-1)and gameMap[x+1][y-1] != "bomb" and gameMap[x+1][y-1] != 0: reveal(x+1, y-1, False)
                    if (y<len(gameMap[x])-1) and (x<len(gameMap[x])-1)and gameMap[x+1][y+1] != "bomb" and gameMap[x-1][y+1] != 0: reveal(x+1, y+1, False)
    else:
        labelArray[x][y].configure(relief=FLAT)
        textArray[x][y].set("")
        if [x,y] not in preRevealed:
            if gameMap[x][y] != "bomb":
                if (x>0) and gameMap[x-1][y] != "bomb": reveal(x-1, y, True)
                if (x<len(gameMap[x])-1) and gameMap[x+1][y] != "bomb": reveal(x+1, y, True)
                if (y>0) and gameMap[x][y-1] != "bomb": reveal(x, y-1, True)
                if (y<len(gameMap[x])-1) and gameMap[x][y+1] != "bomb": reveal(x, y+1, True)

                if (y>0) and (x>0)and gameMap[x-1][y-1] != "bomb" and gameMap[x-1][y-1] != 0: reveal(x-1, y-1, True)
                if (y<len(gameMap[x])-1) and (x>0)and gameMap[x-1][y+1] != "bomb" and gameMap[x-1][y+1] != 0: reveal(x-1, y+1, True)
                if (y>0) and (x<len(gameMap[x])-1)and gameMap[x+1][y-1] != "bomb" and gameMap[x+1][y-1] != 0: reveal(x+1, y-1, True)
                if (y<len(gameMap[x])-1) and (x<len(gameMap[x])-1)and gameMap[x+1][y+1] != "bomb" and gameMap[x-1][y+1] != 0: reveal(x+1, y+1, True)