Python游戏退出问题

Python游戏退出问题,python,pygame,Python,Pygame,我试图让我的程序退出时,ESC键被按下,但也如果windows退出按钮被单击 目前我有以下代码: done = False while not done: for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: done = True break

我试图让我的程序退出时,ESC键被按下,但也如果windows退出按钮被单击

目前我有以下代码:

done = False
while not done:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                done = True
                break # break out of the for loop
        elif event.type == pygame.QUIT:
            done = True
            break # break out of the for loop
    if done:
        break # to break out of the while loop

    # your game stuff
    for dict_containing_value in holdList:           
            i = dict_containing_value['value']
            #pygame.event.pump
            if (i=="("):
                drawBracketBox(bracketColor, x, y)
                label = myfont.render(str(i), 1, (0,0,0))
                screen.blit(label, ((x+x)*50+25,(y+y+y)*50+25))

                x=x+1
            elif (i==")"):
                drawBracketBox(bracketColor, x, y)
                label = myfont.render(str(i), 1, (0,0,0))
                screen.blit(label, ((x+x)*50+31,(y+y+y)*50+25))

                x=x+1
            elif (i=="IF"):
                drawFunctionBox(functionColor, x, y)
                label = myfont.render(str(i), 1, (0,0,0))
                screen.blit(label, ((x+x)*50+21,(y+y+y)*50+22))

                x=x+1
            elif (i=="sum"):
                drawFunctionBox(functionColor, x, y)
                label = myfont.render((i), 1, (0,0,0))
                screen.blit(label, ((x+x)*50+14,(y+y+y)*50+22))

                x=x+1
            elif (i=="+"):
                drawOperatorCircle(opColor, x, y)
                label = myfont.render(str(i), 1, (0,0,0))
                screen.blit(label, ((x+x)*50+31,(y+y+y)*50+22))

                x=x+1
            elif (i=="-"):
                drawOperatorCircle(opColor, x, y)
                label = myfont.render(str(i), 1, (0,0,0))
                screen.blit(label, ((x+x)*50+32,(y+y+y)*50+22))

                x=x+1
            elif (i=="*"):
                drawOperatorCircle(opColor, x, y)
                label = myfont.render(str(i), 1, (0,0,0))
                screen.blit(label, ((x+x)*50+31,(y+y+y)*50+26))

                x=x+1
            elif (i=="/"):
                drawOperatorCircle(opColor, x, y)
                label = myfont.render(str(i), 1, (0,0,0))
                screen.blit(label, ((x+x)*50+32,(y+y+y)*50+22))

                x=x+1
            else:
                drawConstantBox(constColor, x, y)
                label = myfont.render(str(i), 1, (0,0,0))
                screen.blit(label, ((x+x)*50+14,(y+y+y)*50+22))

                x=x+1
    pygame.display.update()
当前输出是持续循环my for dict_,其中包含holdList:loop中的_值,这意味着它会多次打印输出-这不是我想要的结果

请看下面的图片顶部的图片是我目前的结果,按钮是我想要的结果
您可以创建一个终止函数:

def terminate():
    pygame.quit()
    sys.exit()
while True:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                pygame.quit()
                sys.exit()

        elif event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
当按下/释放退出键或/和调用退出事件时,调用和终止

done = False
while not done:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                done = True
        elif event.type == pygame.QUIT:
            done = True
    if done:
        terminate()

或者,您可以只调用pygame.quit和sys.exit,而不使用函数:

def terminate():
    pygame.quit()
    sys.exit()
while True:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                pygame.quit()
                sys.exit()

        elif event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

测试是否在按下键之前退出,而不是在按下键之后退出,因为ESC也是一个按下键事件

x设置的初始值在哪里?一般来说,您希望循环运行不止一次,对吗?否则,为什么要编写循环?随着时间的推移,你认为x的值会发生什么变化?为什么?@KarlKnechtel它们的定义就在我开始复制的地方。很抱歉错过了。它们只是声明为x=1,y=1请发布完整的代码;holdList是在哪里定义的?此外,当while循环不断检查用户输入时,它也会进行反复的操作。将睡眠放在那里可能只有10毫秒,但它会阻止您的CPU阻塞。@Arond在定义holdList的地方发布需要发布我的大部分代码-我知道我的for循环可以工作,因为它显示了我所附图片下半部分中显示的内容-但是问题是,当我运行程序时,窗口立即停止响应-因此我认为这是因为它需要知道何时退出?事件检查代码似乎是正确的。如果你有一个双缓冲的表面,你应该清除和翻转它的每一个循环,以避免覆盖问题,你似乎有。另外,由于x值是在循环之外定义的,所以在whilenotdone代码的下一次迭代中,它永远不会设置为1。您的答案应该有很多信息,以便任何人都能理解,这应该是一条注释