Python Forum
[PyGame] PyGame does not close when I press the close button - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: Game Development (https://python-forum.io/forum-11.html)
+--- Thread: [PyGame] PyGame does not close when I press the close button (/thread-10567.html)



PyGame does not close when I press the close button - Midnight_Sparkle3344 - May-25-2018

# alien_invasion.py
import sys
import pygame

def run_game():
    # Initialize game and create a screen object.
    pygame.init()
    screen = pygame.display.set_mode((800,400))
    pygame.display.set_caption("Alien Invasion")

    # Set the background color.
    bg_color = (230, 230, 230)
    
    # Start the main loop for the game.
    while True:

        # Watch for keyboard and mouse events.
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
        
        # Redraw the screen during each pass through the loop.
        screen.fill(bg_color)
            
        # Make the most recently drown screen visible.
        pygame.display.flip()

run_game()
I am using Python 3.4.4 with the appropriate PyGame version. While this code runs, for some reason the application does not close. I have to close the IDLE shell itself in order to close the window. I'm not sure why the game doesn't close.


RE: PyGame does not close when I press the close button - metulburr - May-25-2018

you should never use sys.quit to exit a program. You should let the program run to the end of the script. Your problem is you need pygame.quit() if i recall in combo with IDLE to quit properly.

running = True

while running:
...
   if event.type == pygame.QUIT:
      running = False
and then at the very end of the script put
pygame.quit()



RE: PyGame does not close when I press the close button - Midnight_Sparkle3344 - May-25-2018

(May-25-2018, 05:05 PM)metulburr Wrote: you should never use sys.quit to exit a program. You should let the program run to the end of the script. Your problem is you need pygame.quit() if i recall in combo with IDLE to quit properly.

running = True

while running:
...
   if event.type == pygame.QUIT:
      running = False
and then at the very end of the script put
pygame.quit()

Thank you. That worked.


RE: PyGame does not close when I press the close button - Midnight_Sparkle3344 - May-25-2018

I moved the loop in a file called "game_functions.py"

import sys
import pygame


def check_events(bValue, pygame):
    """Respond to keypresses and mouse events."""
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            bValue = False
I'm not sure where I should have passed the pygame object also, but I thought that was the way to get it to work. Here is my main file:

alien_invasion.py:
# alien_invasion.py
import pygame

from settings import Settings
from ship import Ship
import game_functions as gf

def run_game():

    # Boolean value
    b_is_running = True
    
    # Initialize game and create a screen object.
    pygame.init()
    ai_settings = Settings()
    screen_resolution = (ai_settings.screen_width, ai_settings.screen_height)
    screen = pygame.display.set_mode(screen_resolution)
    pygame.display.set_caption("Alien Invasion")

    # Make a ship.
    ship = Ship(screen)
    
    # Start the main loop for the game.
    while b_is_running:

        gf.check_events(b_is_running, pygame)
        gf.update_screen(ai_settings,screen,ship)
        # Respond to keypresses and mouse events.
        # for event in pygame.event.get():
        #    if event.type == pygame.QUIT:
        #        b_is_running = False
        
        # Redraw the screen during each pass through the loop.
        # screen.fill(ai_settings.bg_color)
        # ship.blitme()
        
        # Make the most recently drown screen visible.
        # pygame.display.flip()

        
run_game()

pygame.quit()
The ship gets drawn, so the function update_screen works. It's the function check_events that does that seem to work. Any thoughts?


RE: PyGame does not close when I press the close button - metulburr - May-25-2018

well i dont know what gf.check_events() is doing, so i couldnt say


RE: PyGame does not close when I press the close button - Midnight_Sparkle3344 - May-25-2018

(May-25-2018, 09:35 PM)metulburr Wrote: well i dont know what gf.check_events() is doing, so i couldnt say

gf.check_events(b_is_running, pygame) is basically the for loop I had in the while loop before. It was just moved into a function.

game_functions.py
import sys
import pygame

def check_events(bValue, game):
    """Respond to keypresses and mouse events."""
    for event in game.event.get():
        if event.type == game.QUIT:
            bValue = False

def update_screen(ai_settings, screen, ship):
    screen.fill(ai_settings.bg_color)
    ship.blitme()

    pygame.display.flip()
    
alien_invasion.py
# alien_invasion.py
import pygame

from settings import Settings
from ship import Ship
import game_functions as gf

def run_game():

    # Boolean value
    b_is_running = True
    
    # Initialize game and create a screen object.
    pygame.init()
    ai_settings = Settings()
    screen_resolution = (ai_settings.screen_width, ai_settings.screen_height)
    screen = pygame.display.set_mode(screen_resolution)
    pygame.display.set_caption("Alien Invasion")

    # Make a ship.
    ship = Ship(screen)
    
    # Start the main loop for the game.
    while b_is_running:

        # gf.check_events(b_is_running, pygame)
        # Respond to keypresses and mouse events.
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                b_is_running = False

        
        gf.update_screen(ai_settings,screen,ship)
        # Redraw the screen during each pass through the loop.
        # screen.fill(ai_settings.bg_color)
        # ship.blitme()
        
        # Make the most recently drown screen visible.
        # pygame.display.flip()

        
run_game()

pygame.quit()



RE: PyGame does not close when I press the close button - metulburr - May-25-2018

Sorry didnt see it there. If your going to put the event loop in a function then you need to return bValue to update b_is_running value. A better method would be to use a control class and just pass that same value around as an attribute to avoid function parameters all over the place.


RE: PyGame does not close when I press the close button - Midnight_Sparkle3344 - May-25-2018

(May-25-2018, 09:55 PM)metulburr Wrote: Sorry didnt see it there. If your going to put the event loop in a function then you need to return bValue to update b_is_running value. A better method would be to use a control class and just pass that same value around as an attribute to avoid function parameters all over the place.

Yeah, you're right. I'll set one up. I have done that a lot in languages like C++ and C#, etc. Python's taking some getting used to.


RE: PyGame does not close when I press the close button - metulburr - May-25-2018

here is an example in a small finished game
https://github.com/metulburr/FloodIt/blob/master/data/control.py


RE: PyGame does not close when I press the close button - d3sh19th - Dec-16-2022

try python's in_built function exit(), that should work