如何解决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 举报,一经查实,本站将立刻删除。