why is the exit window button work but the exit button in the game does not work?

i'm making a start menu for my game but when i hit the exit button i made in the start menu, it doesn't exit. Is there anything wrong with my code?

I tried making a function for the exit, put it in the code that exit the game with the window exit button, but nothing worked.

import pygame
import os
pygame.mixer.pre_init()
pygame.mixer.init(44100, 16, 2, 262144)
pygame.init()
from pygame.locals import*


pygame.mixer.music.load(os.path.join(os.getcwd(), 'Sounds', 
'intro.ogg'))
pygame.mixer.music.set_volume(0.3)
pygame.mixer.music.play(-1)  

FPS = 60
white = (255,255,255)
grey = (128,128,128)
black = (0,0,0)
red = (255,0,0)
orange = (255,128,0)
yellow = (255,255,0)
green = (0,255,0)
Lgreen = (128,255,0)
blue = (0,0,255)
Lblue = (0,255,255)
purple = (255,0,255)
pink = (255,0,127)

pygame.display.set_caption('Snake Universe')
Title = pygame.image.load('Graphics/Title.png')
Play = pygame.image.load('Graphics/Play.png')
Option = pygame.image.load('Graphics/Option.png')
Exit = pygame.image.load('Graphics/Exit.png')
LinePX = pygame.image.load('Graphics/LinePX.png')
LineO = pygame.image.load('Graphics/LineO.png')
clock = pygame.time.Clock()
movie = pygame.movie.Movie('Video/bg.mpg')
screen = pygame.display.set_mode((1280, 720))
bgE = pygame.image.load('Graphics/transparent.png')
movie_screen = pygame.Surface(movie.get_size()).convert()


movie.set_display(movie_screen)
movie.play()


y = 235
y1 = 3000



cnt = 0
playing = True
while playing:
    cnt+=1
    if cnt>=1870:
        cnt=0
        movie.rewind()
        movie.play()
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key==pygame.K_RETURN:
                if y == 426:
                    movie.stop()
                    playing = False
                    pygame.quit()
                    quit()      
            if event.key == pygame.K_UP:
                y += 1
                if y == 3236:
                    y = 235
                    y1 = 3000
                if y == 236:
                    y = 425
                    y1 = 3000
                if y == 426:
                    y1 =335
                    y = 3235

            if event.key == pygame.K_DOWN:
                y += 1
                if y == 236:
                    y = 3235
                    y1 = 335
                if y == 3236:
                    y1 = 3000
                    y = 425
                if y == 426:
                    y1 = 3000
                    y = 235

            if event.type == pygame.QUIT:
                movie.stop()
                playing = False
                pygame.quit()
                quit()

   screen.blit(movie_screen,(0, 0))
   screen.blit(Title, (360, 0))
   screen.blit(Play, (460, 250))
   screen.blit(Exit, (460, 450))
   screen.blit(LinePX, (482.5, y))
   screen.blit(LineO, (482.5, y1))
   screen.blit(Option, (460, 350))
   screen.blit(bgE, (-100, 0))
   pygame.display.update()
   clock.tick(FPS)

i expected it to exit the window but instead it doesn't do anything.


Solution 1:

The main loop runs as long as playing is True.

playing = True
while playing:
    # [...]

When the pygame.QUIT event is handled, playing is set False the main loop condition is fails:

if event.type == pygame.QUIT:
    playing = False
    # [...]

Note, pygame.quit() doesn't terminate the loop, but it uninitialize all pygame modules, which will cause an exception in the following, if it is done in the middle of the application.

If you want to quit the application by the keypad enter key pygame.K_KP_ENTER, the you've to do the same when the pygame.KEYDOWN event is handled:

if event.type == pygame.KEYDOWN:
    if event.key==pygame.K_KP_ENTER:
        playing = False

Or you've to send a pygame.QUIT event by pygame.event.post():

if event.type == pygame.KEYDOWN:
    if event.key==pygame.K_KP_ENTER:
        pygame.event.post(pygame.event.Event(pygame.QUIT))