You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 01:45:00