0

This is the error message

C:\Users\Me\Documents\Fan game>python testing_file.py
    pygame 2.0.1 (SDL 2.0.14, Python 3.9.5)
    Hello from the pygame community. https://www.pygame.org/contribute.html
    Traceback (most recent call last):
      File "C:\Users\Me\Documents\Fan game\testing_file.py", line 1685, in <module>
        menu_screen()
      File "C:\Users\Me\Documents\Fan game\testing_file.py", line 464, in menu_screen
        if event.type == MOUSEBUTTONDOWN:
    UnboundLocalError: local variable 'event' referenced before assignment

My back button works sometimes, but sometimes I get that error message.

my code is as follows;

...
while var_menu_screen == 0:
        
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
        
        rand = random.randint(1, 8)
        x,y = pygame.mouse.get_pos()        
        if rand == 1:
            if var_stat == 1:
                screen.fill((0,0,0))
                screen.blit(image_menu_background, centered_image_menu_background) 
                if 154 < x < 380 and 221 < y < 272:
                    screen.blit(image_options_hover, (154, 221))
                    var_options = 1
                    if event.type == MOUSEBUTTONDOWN:
                        var_menu_screen = 1
                else:
                    screen.blit(image_options, (154, 221))
                    var_options = 0
                    
                if 154 < x < 396 and 301 < y < 375:
                    screen.blit(image_new_game_hover, (154, 301))
                    var_new_game = 1
                    if event.type == MOUSEBUTTONDOWN:
                        var_menu_screen = 2
                else:
                    screen.blit(image_new_game, (154, 301))
                    var_new_game = 0
                    
                if var_night_number > 1:    
                    if 154 < x < 351 and 399 < y < 463:
                        screen.blit(image_continues_hover, (154, 399))
                        var_continues = 1
                        if event.type == MOUSEBUTTONDOWN:
                            var_menu_screen = 3
                    else:
                        screen.blit(image_continues, (154, 399))
                        var_continues = 0
                else:
                    screen.blit(image_continues_disabled, (154, 399))
                    
                if 154 < x < 325 and 489 < y < 557:
                    screen.blit(image_credits_hover, (154, 489))
                    var_credits = 1
                    if event.type == MOUSEBUTTONDOWN:
                        var_menu_screen = 4
                else: 
                    screen.blit(image_credits, (154, 489))
                    var_credits = 0
                    
                if 154 < x < 270 and 564 < y < 627:
                    screen.blit(image_quit_hover, (154, 564))
                    var_quit = 1
                    if event.type == MOUSEBUTTONDOWN:
                        pygame.quit()
                        sys.exit()
                else:
                    screen.blit(image_quit, (154, 564))
                    var_quit = 0
                screen.blit(image_static_2, centered_image_static_2) 
                pygame.display.update()
                var_stat = 2
            else:
                screen.fill((0,0,0))
                screen.blit(image_menu_background, centered_image_menu_background) 
                if 154 < x < 380 and 221 < y < 272:
                    screen.blit(image_options_hover, (154, 221))
                    var_options = 1
                    if event.type == MOUSEBUTTONDOWN:
                        var_menu_screen = 1
                else:
                    screen.blit(image_options, (154, 221))
                    var_options = 0
                    
                if 154 < x < 396 and 301 < y < 375:
                    screen.blit(image_new_game_hover, (154, 301))
                    var_new_game = 1
                    if event.type == MOUSEBUTTONDOWN:
                        var_menu_screen = 2
                else:
                    screen.blit(image_new_game, (154, 301))
                    var_new_game = 0
                    
                if var_night_number > 1:
                    if 154 < x < 351 and 399 < y < 463:
                        screen.blit(image_continues_hover, (154, 399))
                        var_continues = 1
                        if event.type == MOUSEBUTTONDOWN:
                            var_menu_screen = 3
                    else:   
                        screen.blit(image_continues, (154, 399))
                        var_continues = 0
                else:
                    screen.blit(image_continues_disabled, (154, 399))
                    
                if 154 < x < 325 and 489 < y < 557:
                    screen.blit(image_credits_hover, (154, 489))
                    var_credits = 1
                    if event.type == MOUSEBUTTONDOWN:
                        var_menu_screen = 4
                else: 
                    screen.blit(image_credits, (154, 489))
                    var_credits = 0
                    
                if 154 < x < 270 and 564 < y < 627:
                    screen.blit(image_quit_hover, (154, 564))
                    var_quit = 1
                    if event.type == MOUSEBUTTONDOWN:
                        pygame.quit()
                        sys.exit()
                else:
                    screen.blit(image_quit, (154, 564))
                    var_quit = 0    
                screen.blit(image_static_1, centered_image_static_1)            
                pygame.display.update()
                var_stat = 1
...

this is repeated 8 times for each static image.

My back button works as follows;

...

    while var_menu_screen == 4:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
        rand = random.randint(1, 8)
        x, y = pygame.mouse.get_pos()
        if rand == 1:
            if var_stat == 1:           
                screen.fill((0, 0, 0))
                screen.blit(image_credits_screen, centered_image_credits_screen)
                if 154 < x < 258 and 564 < y < 621:
                    screen.blit(image_back_hover, (154, 564))
                    var_back = 1
                    if event.type == MOUSEBUTTONDOWN:
                        var_menu_screen = 0
                else:
                    screen.blit(image_back, (154, 564))
                    var_back = 0
                screen.blit(image_static_2, centered_image_static_2)
                pygame.display.update()
                var_stat = 2
            else:
                screen.fill((0, 0, 0))
                screen.blit(image_credits_screen, centered_image_credits_screen)
                if 154 < x < 258 and 564 < y < 621:
                    screen.blit(image_back_hover, (154, 564))
                    var_back = 1
                    if event.type == MOUSEBUTTONDOWN:
                        var_menu_screen = 0
                else:
                    screen.blit(image_back, (154, 564))
                    var_back = 0
                screen.blit(image_static_1, centered_image_static_1)
                pygame.display.update()
                var_stat = 1
...

this is repeated 8 times for the 8 static images.

Main program;

while True:
    if var_menu_screen == 0:
        menu_screen()
    if var_menu_screen == 1:
        options_screen()
    if var_menu_screen == 2:
        new_game_boyz()
    if var_menu_screen == 3:
        pygame.quit()
        sys.quit()
    if var_menu_screen == 4:
        credits_screen()
    if var_start_game == True:
        break

Don't know why this only works some times. help

1 Answers1

2

You should move your event handling code in the for loop that polls events from pygame, because it's in that loop that event is defined. Your first code becomes :

...
while var_menu_screen == 0:
    mouse_down = False
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == MOUSEBUTTONDOWN:
            mouse_down = True

    rand = random.randint(1, 8)
    x, y = pygame.mouse.get_pos()
    if rand == 1:
        if var_stat == 1:
            screen.fill((0, 0, 0))
            screen.blit(image_menu_background,
                        centered_image_menu_background)
            if 154 < x < 380 and 221 < y < 272:
                screen.blit(image_options_hover, (154, 221))
                var_options = 1
                if mouse_down:
                    var_menu_screen = 1
            else:
                screen.blit(image_options, (154, 221))
                var_options = 0

            if 154 < x < 396 and 301 < y < 375:
                screen.blit(image_new_game_hover, (154, 301))
                var_new_game = 1
                if mouse_down:
                    var_menu_screen = 2
            else:
                screen.blit(image_new_game, (154, 301))
                var_new_game = 0

            if var_night_number > 1:
                if 154 < x < 351 and 399 < y < 463:
                    screen.blit(image_continues_hover, (154, 399))
                    var_continues = 1
                    if mouse_down:
                        var_menu_screen = 3
                else:
                    screen.blit(image_continues, (154, 399))
                    var_continues = 0
            else:
                screen.blit(image_continues_disabled, (154, 399))

            if 154 < x < 325 and 489 < y < 557:
                screen.blit(image_credits_hover, (154, 489))
                var_credits = 1
                if mouse_down:
                    var_menu_screen = 4
            else:
                screen.blit(image_credits, (154, 489))
                var_credits = 0

            if 154 < x < 270 and 564 < y < 627:
                screen.blit(image_quit_hover, (154, 564))
                var_quit = 1
                if mouse_down:
                    pygame.quit()
                    sys.exit()
            else:
                screen.blit(image_quit, (154, 564))
                var_quit = 0
            screen.blit(image_static_2, centered_image_static_2)
            pygame.display.update()
            var_stat = 2
        else:
            screen.fill((0, 0, 0))
            screen.blit(image_menu_background,
                        centered_image_menu_background)
            if 154 < x < 380 and 221 < y < 272:
                screen.blit(image_options_hover, (154, 221))
                var_options = 1
                if mouse_down:
                    var_menu_screen = 1
            else:
                screen.blit(image_options, (154, 221))
                var_options = 0

            if 154 < x < 396 and 301 < y < 375:
                screen.blit(image_new_game_hover, (154, 301))
                var_new_game = 1
                if mouse_down:
                    var_menu_screen = 2
            else:
                screen.blit(image_new_game, (154, 301))
                var_new_game = 0

            if var_night_number > 1:
                if 154 < x < 351 and 399 < y < 463:
                    screen.blit(image_continues_hover, (154, 399))
                    var_continues = 1
                    if mouse_down:
                        var_menu_screen = 3
                else:
                    screen.blit(image_continues, (154, 399))
                    var_continues = 0
            else:
                screen.blit(image_continues_disabled, (154, 399))

            if 154 < x < 325 and 489 < y < 557:
                screen.blit(image_credits_hover, (154, 489))
                var_credits = 1
                if mouse_down:
                    var_menu_screen = 4
            else:
                screen.blit(image_credits, (154, 489))
                var_credits = 0

            if 154 < x < 270 and 564 < y < 627:
                screen.blit(image_quit_hover, (154, 564))
                var_quit = 1
                if mouse_down:
                    pygame.quit()
                    sys.exit()
            else:
                screen.blit(image_quit, (154, 564))
                var_quit = 0
            screen.blit(image_static_1, centered_image_static_1)
            pygame.display.update()
            var_stat = 1
...

Your second code becomes :

...

    while var_menu_screen == 4:
        mouse_down = False
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == MOUSEBUTTONDOWN:
                mouse_down = True
        rand = random.randint(1, 8)
        x, y = pygame.mouse.get_pos()
        if rand == 1:
            if var_stat == 1:           
                screen.fill((0, 0, 0))
                screen.blit(image_credits_screen, centered_image_credits_screen)
                if 154 < x < 258 and 564 < y < 621:
                    screen.blit(image_back_hover, (154, 564))
                    var_back = 1
                    if mouse_down:
                        var_menu_screen = 0
                else:
                    screen.blit(image_back, (154, 564))
                    var_back = 0
                screen.blit(image_static_2, centered_image_static_2)
                pygame.display.update()
                var_stat = 2
            else:
                screen.fill((0, 0, 0))
                screen.blit(image_credits_screen, centered_image_credits_screen)
                if 154 < x < 258 and 564 < y < 621:
                    screen.blit(image_back_hover, (154, 564))
                    var_back = 1
                    if mouse_down:
                        var_menu_screen = 0
                else:
                    screen.blit(image_back, (154, 564))
                    var_back = 0
                screen.blit(image_static_1, centered_image_static_1)
                pygame.display.update()
                var_stat = 1
...

, and the third code is ok, you do not need to change it. EDIT: I added a mouse_down variable so that you can check for mouse down outside of the event loop.

astroide
  • 852
  • 3
  • 15