Pygame调用函数后不会退出

Pygame won't quit after calling the function

我在尝试退出我创建的功能时遇到了一些问题。它似乎并没有打破循环。游戏打开了,我可以玩,但我不能退出,它就一直呆在那里什么都不做,任务栏上的图标全黄了。

这是我的代码:

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()

谢谢,抱歉我的英语不好。

尝试在 pygame.quit() 行前添加 pygame.display.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()

如果你导入 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()

它不起作用的原因是您每帧多次调用 pygame.event.get。第一次调用后事件队列将被清空,因此事件不会得到正确处理。每帧应该只有一个 pygame.event.get 调用。

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

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

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

button函数添加一个events参数:

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 函数在这里一次又一次地弹出,可能是因为它是一种非常糟糕的按钮实现方式。我推荐一个类似于其中之一的解决方案: 或搜索 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()