[英]Why doesn't my button work while program is running?
按開始按鈕后,它會運行程序,但它不允許我使用右下角的退出按鈕,我不知道為什么會這樣。 我希望它繼續運行程序,但仍然允許我使用按鈕,所以如果我想中途退出它會讓我。 項目描述:“對於我的項目,我將使用 python 創建一個隨機迷宮生成軟件。我將創建一個網格以呈現給用戶。該軟件將從左上角開始,然后創建迷宮,隨機方向並最終排在右下角。”
#importing the pygame Module
import pygame
import sys
from random import randint
from time import sleep
#assigning the dimensions of window
width = 450
height = 450
#setting colours to be used (used rgb values)
black = (0,0,0)#for background of maze
white = (255,255,255)#for colour of grid
red = (255,0,0)#colour for actual maze
blue = (0,0,255)#colour for backtrack
green = (0,255,0)#will be used to show solution
lightgrey = (170,170,170)#used as colours for buttons
darkgrey = (100,100,100)
def moveup(x,y):
pygame.draw.rect(SCREEN,red,(x+1,y-w+1,19,39),0)
pygame.display.update() #moves a square up and makes red
def movedown(x,y):
pygame.draw.rect(SCREEN,red,(x+1,y+1,19,39),0)
pygame.display.update() #moves a square down and makes red
def moveleft(x,y):
pygame.draw.rect(SCREEN,red,(x-w+1,y+1,39,19),0)
pygame.display.update() #moves a square left and makes red
def moveright(x,y):
pygame.draw.rect(SCREEN,red,(x+1,y+1,39,19),0)
pygame.display.update() #moves a square right and makes red
def backtrack(x,y):
pygame.draw.rect(SCREEN,red,(x+1,y+1,18,18),0)
pygame.display.update()#this will change colour of cell back to red to indicate it
#going back through cells to find unvisited one
def singlecell(x,y):
pygame.draw.rect(SCREEN,blue,(x+1,y+1,18,18),0)
pygame.display.update()#this will change colour of cell to indicate it going back
#through cells to find unvisited one
def solutionchange(x,y):
pygame.draw.rect(SCREEN,green,(x+8,y+8,5,5),0)
pygame.display.update()#This will add a smaller square to the big square to make a
#route
def drawgrid(x,y,w):
for i in range(1,21): #this creates cells from left to right then goes down to next
#row.
x = 20
y = y+20
for a in range(1,21):
pygame.draw.line(SCREEN,white,[x,y],[x+w,y])#top line of cell
pygame.draw.line(SCREEN,white,[x,y+w],[x,y])#left line of cell
pygame.draw.line(SCREEN,white,[x+w,y+w],[x,y+w])#bottom line of cell
pygame.draw.line(SCREEN,white,[x+w,y],[x+w,y+w])#right line of cell
cell_list.append((x,y))
x = x + 20
def mazemaker(x,y):
visited.append((x,y))#adds co-ords to list of cells visited
cellstack.append((x,y))
while len(cellstack) > 0:
sleep(0.05) #adds delay between movements so you can see it being made.
pickmovecell = []
if (x+w,y) not in visited and (x+w,y) in cell_list: #multiple if used and not
#elif as if they all true they all need to take place or if some true they all
#need take place
pickmovecell.append("right")
if (x-w,y) not in visited and (x-w,y) in cell_list:
pickmovecell.append("left")
if (x,y-w) not in visited and (x,y-w) in cell_list:#checks if x and y co-ords of
#next cell is visited or not
pickmovecell.append("up")#adds to list that it can move up
if (x,y+w) not in visited and (x,y+w) in cell_list:
pickmovecell.append("down")
if len(pickmovecell) > 0: #this point onwards will pick randomly which direction
#to go from available diretions.
choice = randint(0,len(pickmovecell)-1)
directionmove = pickmovecell[choice]
if directionmove == "up":
solution[x,y-w] = x,y
moveup(x,y)
y = y-w
visited.append((x,y)) #This part checks what direction has been picked and
#changes x and y co-ords based on it and adds new cell to lists.
cellstack.append((x,y))
elif directionmove == "down":
solution[x,y+w] = x,y
movedown(x,y)
y = y+w
visited.append((x,y))
cellstack.append((x,y))
elif directionmove == "left":
solution[x-w,y] = x,y
moveleft(x,y)
x = x-w
visited.append((x,y))
cellstack.append((x,y))
elif directionmove == "right":
solution[x+w,y] = x,y
moveright(x,y)
x = x+w
visited.append((x,y))
cellstack.append((x,y))
else:
x,y = cellstack.pop()#pop removes last thing added to list this allows me to
#make the maze go back
singlecell(x,y)#calls function to show moving back
sleep(0.04)
backtrack(x,y)#calls function to make cells red again
def solutionroute(x,y): #This will make it solve the maze and call the colour change
#function to add a little dot to indicate solution route
solutionchange(x,y)
while (x,y) != (20,20):
x,y = solution[x,y]
solutionchange(x,y)
sleep(0.1)
def menu():
global SCREEN,x,y,w,cell_list,visited,cellstack,solution
#maze variables
x = 0 #x axis
y = 0#y axis
w = 20#width of cell
cell_list = []#contains all x and y values of all cells
visited = []#This will keep track of all visited cells and order visited in
cellstack = []#order and cells checked/gone through
solution = {} #This is a dictionary which means it wont have duplicate coordinates
#which a list would allow
pygame.init() #initalising pygame
SCREEN = pygame.display.set_mode((width,height))#creates the actual window
SCREEN.fill(black)#fills the background as black
smallfont = pygame.font.SysFont('Corbel',35)#sets type of font and size of it
starttext = smallfont.render('Start' , True , white)#sets what text i want on button
#to variable
quittext = smallfont.render("Quit",True,white)
while True:
for ev in pygame.event.get():#if x in top right clicked window shuts down
if ev.type == pygame.QUIT:
pygame.quit()
sys.exit()
if ev.type == pygame.MOUSEBUTTONDOWN:#Checks if mouse button is clicked
if 170 <= mouse[0] <= 170+140 and 170 <= mouse[1] <= 170+40:#if button is
#clicked it runs start functiom
start()
if ev.type == pygame.MOUSEBUTTONDOWN:
if 170 <= mouse[0] <= 170+140 and 220 <= mouse[1] <= 220+40:#if button is
#clicked quits program
pygame.quit()
sys.exit()
mouse = pygame.mouse.get_pos()#Stores the x,y cords of mouse to a variable
if 170 <= mouse[0] <= 170+140 and 170 <= mouse[1] <= 170+40:#if mouse hovers over
#button it changes colour
pygame.draw.rect(SCREEN,lightgrey,[170,170,140,40])
else:
pygame.draw.rect(SCREEN,darkgrey,[170,170,140,40])
if 170 <= mouse[0] <= 170+140 and 220 <= mouse[1] <= 220+40:
pygame.draw.rect(SCREEN,lightgrey,[170,220,140,40])
else:
pygame.draw.rect(SCREEN,darkgrey,[170,220,140,40])
SCREEN.blit(starttext , (170+35,170+7))#Adds text to the button
SCREEN.blit(quittext , (170+35,220+7))
pygame.display.update()#Adds the additons to the window
def start():#This function calls all the other functions to make the program work
SCREEN = pygame.display.set_mode((width,height))#Resets the window so button not
#there
SCREEN.fill(black)#fills the background as black
smallfont = pygame.font.SysFont('Corbel',25)#sets type of font and size of it
quittext = smallfont.render("Quit",True,white)
while True:
for ev in pygame.event.get():
if ev.type == pygame.MOUSEBUTTONDOWN:
if 300 <= mouse[0] <= 300+140 and 425 <= mouse[1] <= 425+20:#if button is
#clicked goes back to menu
pygame.quit()
sys.exit()
mouse = pygame.mouse.get_pos()#Stores the x,y cords of mouse to a variable
if 300 <= mouse[0] <= 300+140 and 425 <= mouse[1] <= 425+20:
pygame.draw.rect(SCREEN,lightgrey,[300,425,140,20])
else:
pygame.draw.rect(SCREEN,darkgrey,[300,425,140,20])
SCREEN.blit(quittext , (300+50,425))
pygame.display.update()
x,y = 20,20 #sets start x and y co-ords
drawgrid(40,0,20) #calls draw grid function
mazemaker(x,y)#makes maze
solutionroute(400,400)#calls function to show solution route to user
sleep(30)#Waits 30 seconds
menu()#Runs main menu again
menu()
將 start() 函數更改為以下代碼。 一旦迷宮建成,它就會顯示“退出”。 :)
def start():#This function calls all the other functions to make the program work
SCREEN = pygame.display.set_mode((width,height))#Resets the window so button not
#there
SCREEN.fill(black)#fills the background as black
smallfont = pygame.font.SysFont('Corbel',25)#sets type of font and size of it
quittext = smallfont.render("Quit",True,white)
drawgrid(40,0,20) #calls draw grid function
x,y = 20,20 #sets start x and y co-ords
mazemaker(x,y)#makes maze
solutionroute(400,400)#calls function to show solution route to user
while True:
mouse = pygame.mouse.get_pos()
for ev in pygame.event.get():
if ev.type == pygame.MOUSEBUTTONDOWN:
if 300 <= mouse[0] <= 300+140 and 425 <= mouse[1] <= 425+20:#if button is
pygame.display.get_surface().fill((0, 0, 0))
#clicked goes back to menu
return
#Stores the x,y cords of mouse to a variable
if 300 <= mouse[0] <= 300+140 and 425 <= mouse[1] <= 425+20:
pygame.draw.rect(SCREEN,lightgrey,[300,425,140,20])
else:
pygame.draw.rect(SCREEN,darkgrey,[300,425,140,20])
SCREEN.blit(quittext , (300+50,425))
pygame.display.update()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.