调用该函数后Pygame不会退出

时间:2018-06-25 01:26:37

标签: python function pygame exit exit-code

尝试退出我创建的函数时遇到了一些麻烦。它似乎并没有打破循环。游戏打开,我可以玩耍,但是我不能退出,它不做任何事情就停留在那儿,任务栏上的图标变为黄色。

这是我的代码:

import pygame, os, sys, math

black = (0,0,0)
white = (255,255,255)
grey = (128, 128, 128)
gameDisplay = pygame.display.set_mode((800,600))
def game_menu():
    os.environ["SDL_VIDEO_CENTERED"] = "1"
    pygame.init()

    pygame.display.set_caption(".")

    menu = True
    events = pygame.event.get()
    while menu:
        for event in events:
           if event.type == pygame.QUIT:
              menu = False
              pygame.quit()
              quit()


    DISPLAYSURF = pygame.display.set_mode((800, 600))
    DISPLAYSURF.fill(black)

    font = pygame.font.Font('MATRIX.ttf',60)
    TextSurf, TextRect = text_objects("MATRIX PASA PALABRA", font,white)
    TextRect.center = ((600/2),(50))
    gameDisplay.blit(TextSurf, TextRect)
    #Jugar

    button("Jugar",300,200,200,50,None)
    button("Instrucciones",300,275,200,50,None)
    button("Dificultad",300,350,200,50,None)
    button("Salir",300,425,200,50,None)
    pygame.display.update()
def text_objects(text, font,color):
     textSurface = font.render(text, True, color)
      return textSurface, textSurface.get_rect()

def button(msg,x,y,w,h,action=None):
    mouse = pygame.mouse.get_pos()

     events = pygame.event.get()

     if x+w> mouse[0] > (x) and y+h > mouse[1] > y:
        pygame.draw.rect(gameDisplay,grey,(x,y,w,h))
        for event in events:
            if event.type ==pygame.MOUSEBUTTONUP and msg=="Salir":
                pygame.quit()
                quit()
            elif event.type==pygame.MOUSEBUTTONUP and msg=="Jugar":
                None
     else:
          pygame.draw.rect(gameDisplay,white,(x,y,w,h))
          smalltext= pygame.font.Font("MATRIX.ttf",30)
          textsrf,textrct=text_objects(msg,smalltext,black)
          textrct.center = ((x+(w/2)),(y+(h/2)))
          gameDisplay.blit(textsrf,textrct)


if __name__ == "__main__":
   game_menu()

对不起,我的英语不好。

3 个答案:

答案 0 :(得分:0)

尝试在pygame.display.quit()行之前添加pygame.quit()。这应该关闭所有打开的显示。

编辑: 问题在于您的大多数程序都不在while循环内。最重要的是,events = pygame.event.get()不在while循环内,因此事件永远不会更新。

将代码重新排列为如下所示即可:

def game_menu():
    os.environ["SDL_VIDEO_CENTERED"] = "1"
    pygame.init()
    pygame.display.set_caption(".")

    menu = True

    while menu:
        events = pygame.event.get()
        DISPLAYSURF = pygame.display.set_mode((800, 600))
        DISPLAYSURF.fill(black)

        font = pygame.font.Font('MATRIX.ttf',60)
        TextSurf, TextRect = text_objects("MATRIX PASA PALABRA", font,white)
        TextRect.center = ((600/2),(50))
        gameDisplay.blit(TextSurf, TextRect)
        #Jugar

        button("Jugar",300,200,200,50,None)
        button("Instrucciones",300,275,200,50,None)
        button("Dificultad",300,350,200,50,None)
        button("Salir",300,425,200,50,None)
        pygame.display.update()
        for event in events:
           if event.type == pygame.QUIT:
              menu = False
              pygame.quit()
              quit()

答案 1 :(得分:0)

如果您导入sys,则可以使用它退出代码。

import sys
def game_menu():
    menu = True
    while menu:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

答案 2 :(得分:0)

之所以不起作用,是因为您每帧多次调用pygame.event.get。第一次调用后,事件队列将被清空,因此将无法正确处理事件。每帧应该只有一个pygame.event.get通话。

要解决此问题,您可以将pygame.event.get返回的事件列表分配给主while循环中的变量,然后将其传递给button函数。

while menu:
    events = pygame.event.get()
    for event in events:
        # etc.

    button("Jugar",300,200,200,50,events,None)

events函数中添加一个button参数:

def button(msg,x,y,w,h,events,action=None):
    mouse = pygame.mouse.get_pos()

    if x+w> mouse[0] > (x) and y+h > mouse[1] > y:
        pygame.draw.rect(gameDisplay,grey,(x,y,w,h))
        for event in events:
            # etc.

顺便说一句,这个button函数不断在这里反复弹出,可能是因为这是实现按钮的一种非常不好的方法。我建议类似以下解决方案之一的解决方案:https://stackoverflow.com/a/47664205/6220679或搜索pygame GUI工具包(SGC很好)。


其他人已经提到您的示例中的缩进是错误的,并且sys.exit是比quit函数更好的退出方式。

这是一个固定的完整示例:

import pygame, os, sys, math

black = (0,0,0)
white = (255,255,255)
grey = (128, 128, 128)
gameDisplay = pygame.display.set_mode((800,600))


def game_menu():
    os.environ["SDL_VIDEO_CENTERED"] = "1"
    pygame.init()

    pygame.display.set_caption(".")
    DISPLAYSURF = pygame.display.set_mode((800, 600))
    clock = pygame.time.Clock()

    menu = True
    while menu:
        events = pygame.event.get()
        for event in events:
           if event.type == pygame.QUIT:
              menu = False
              pygame.quit()
              sys.exit()

        DISPLAYSURF.fill((30, 30, 30))

        font = pygame.font.Font(None,60)
        TextSurf, TextRect = text_objects("MATRIX PASA PALABRA", font,white)
        TextRect.center = ((600/2),(50))
        gameDisplay.blit(TextSurf, TextRect)
        #Jugar

        button("Jugar",300,200,200,50,events,None)
        button("Instrucciones",300,275,200,50,events,None)
        button("Dificultad",300,350,200,50,events,None)
        button("Salir",300,425,200,50,events,None)
        pygame.display.update()
        clock.tick(60)


def text_objects(text, font,color):
    textSurface = font.render(text, True, color)
    return textSurface, textSurface.get_rect()


def button(msg,x,y,w,h,events,action=None):
    mouse = pygame.mouse.get_pos()

    if x+w> mouse[0] > (x) and y+h > mouse[1] > y:
        pygame.draw.rect(gameDisplay,grey,(x,y,w,h))
        for event in events:
            if event.type ==pygame.MOUSEBUTTONUP and msg=="Salir":
                pygame.quit()
                sys.exit()
            elif event.type==pygame.MOUSEBUTTONUP and msg=="Jugar":
                print("jugar")
    else:
        pygame.draw.rect(gameDisplay,white,(x,y,w,h))
        smalltext= pygame.font.Font(None,30)
        textsrf,textrct=text_objects(msg,smalltext,black)
        textrct.center = ((x+(w/2)),(y+(h/2)))
        gameDisplay.blit(textsrf,textrct)


if __name__ == "__main__":
   game_menu()
相关问题