簡體   English   中英

為什么我的按鈕在程序運行時不起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM