微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UnboundLocalError:赋值前引用了局部变量“事件”

如何解决UnboundLocalError:赋值前引用了局部变量“事件”

这是错误信息

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

我的后退按钮有时会起作用,但有时我会收到该错误消息。

我的代码如下;

...
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))
                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,221))
                    var_options = 0
                    
                if 154 < x < 396 and 301 < y < 375:
                    screen.blit(image_new_game_hover,301))
                    var_new_game = 1
                    if event.type == MOUSEBUTTONDOWN:
                        var_menu_screen = 2
                else:
                    screen.blit(image_new_game,301))
                    var_new_game = 0
                    
                if var_night_number > 1:    
                    if 154 < x < 351 and 399 < y < 463:
                        screen.blit(image_continues_hover,399))
                        var_continues = 1
                        if event.type == MOUSEBUTTONDOWN:
                            var_menu_screen = 3
                    else:
                        screen.blit(image_continues,399))
                        var_continues = 0
                else:
                    screen.blit(image_continues_disabled,399))
                    
                if 154 < x < 325 and 489 < y < 557:
                    screen.blit(image_credits_hover,489))
                    var_credits = 1
                    if event.type == MOUSEBUTTONDOWN:
                        var_menu_screen = 4
                else: 
                    screen.blit(image_credits,489))
                    var_credits = 0
                    
                if 154 < x < 270 and 564 < y < 627:
                    screen.blit(image_quit_hover,564))
                    var_quit = 1
                    if event.type == MOUSEBUTTONDOWN:
                        pygame.quit()
                        sys.exit()
                else:
                    screen.blit(image_quit,564))
                    var_quit = 0
                screen.blit(image_static_2,centered_image_static_2) 
                pygame.display.update()
                var_stat = 2
            else:
                screen.fill((0,301))
                    var_new_game = 0
                    
                if var_night_number > 1:
                    if 154 < x < 351 and 399 < y < 463:
                        screen.blit(image_continues_hover,399))
                        var_continues = 1
                        if event.type == MOUSEBUTTONDOWN:
                            var_menu_screen = 3
                    else:   
                        screen.blit(image_continues,564))
                    var_quit = 0    
                screen.blit(image_static_1,centered_image_static_1)            
                pygame.display.update()
                var_stat = 1
...

对于每个静态图像重复 8 次。

我的后退按钮的工作原理如下;

...

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

对于 8 个静态图像重复 8 次。

主程序;

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

不知道为什么这只在某些时候有效。帮助

解决方法

您应该将事件处理代码移到从 pygame 轮询事件的 for 循环中,因为 event 是在该循环中定义的。您的第一个代码变为:

...
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))
            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,221))
                var_options = 0

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

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

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

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

你的第二个代码变成:

...

    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))
                screen.blit(image_credits_screen,centered_image_credits_screen)
                if 154 < x < 258 and 564 < y < 621:
                    screen.blit(image_back_hover,564))
                    var_back = 1
                    if mouse_down:
                        var_menu_screen = 0
                else:
                    screen.blit(image_back,564))
                    var_back = 0
                screen.blit(image_static_2,centered_image_static_2)
                pygame.display.update()
                var_stat = 2
            else:
                screen.fill((0,564))
                    var_back = 0
                screen.blit(image_static_1,centered_image_static_1)
                pygame.display.update()
                var_stat = 1
...

,第三个代码没问题,你不需要改变它。 编辑:我添加了一个 mouse_down 变量,以便您可以在事件循环之外检查鼠标按下。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。