如何在Pygame中修改显示文本?按下空格触发UnboundLocalError如何解决
错误原因
你遇到的UnboundLocalError是Python变量作用域规则导致的:
- 你在代码顶层定义的
x属于全局变量 - 当你在
main()函数内执行x += 1操作时,Python默认将x识别为main函数的局部变量,但你没有在函数内先给这个局部变量赋值就尝试修改它,因此触发报错 draw_window()里只是读取x的值没有修改,所以不会触发这个报错
修复方案
方案1:使用global声明(快速适配现有代码)
在main()函数开头声明你要修改的x是全局变量即可,同时注意你代码末尾的pygame.quit漏了括号,会导致程序退出异常,一并修正:
import pygame import os pygame.font.init() FONT = pygame.font.SysFont('comicsans', 100) SCREENX = 1700 SCREENY = 900 WHITE = (255, 255, 255) x = 0 TEXT = FONT.render(str(x), 1, (255, 255, 255)) WIN = pygame.display.set_mode((SCREENX, SCREENY)) BACKGROUND = pygame.transform.scale(pygame.image.load( os.path.join('Assets', 'space.png')), (SCREENX, SCREENY)) def draw_window(): WIN.blit(BACKGROUND, (0, 0)) TEXT = FONT.render(str(x), 1, (255, 255, 255)) WIN.blit(TEXT, ((SCREENX - TEXT.get_width()) / 2, (SCREENY - TEXT.get_height()) / 2)) pygame.display.update() def main(): global x # 新增这行,声明x是全局变量 run = True while run: for event in pygame.event.get(): if event.type == pygame.QUIT: run = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: x += 1 draw_window() pygame.quit() # 补上括号 if __name__ == '__main__': main()
方案2:避免全局变量(更规范的写法)
全局变量容易出现不可预期的修改问题,更推荐把变量作为参数传递:
import pygame import os pygame.font.init() FONT = pygame.font.SysFont('comicsans', 100) SCREENX = 1700 SCREENY = 900 WHITE = (255, 255, 255) WIN = pygame.display.set_mode((SCREENX, SCREENY)) BACKGROUND = pygame.transform.scale(pygame.image.load( os.path.join('Assets', 'space.png')), (SCREENX, SCREENY)) def draw_window(x): WIN.blit(BACKGROUND, (0, 0)) TEXT = FONT.render(str(x), 1, (255, 255, 255)) WIN.blit(TEXT, ((SCREENX - TEXT.get_width()) / 2, (SCREENY - TEXT.get_height()) / 2)) pygame.display.update() def main(): x = 0 # x定义在main函数内部 run = True while run: for event in pygame.event.get(): if event.type == pygame.QUIT: run = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: x += 1 draw_window(x) # 把x作为参数传给绘制函数 pygame.quit() if __name__ == '__main__': main()
内容的提问来源于stack exchange,提问作者Snowman Fighter
相关产品推荐
相关产品推荐

