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

Pygame延迟执行绘制内容后瞬间消失的问题咨询

解决PyGame延迟显示内容后无法保持显示的问题

嗨,我明白你遇到的困扰了——用pygame.time.set_timer()触发事件绘制文本,但文本只闪一下就消失了对吧?这其实是主循环的逻辑导致的,我来给你捋清楚并修复它。

问题根源

你的主循环里每次都会执行screen.fill((0,0,0))清空整个屏幕,而USEREVENT只是在触发的那一帧调用了Other.show_heading()绘制文本。等到下一次循环,屏幕又被清空,却没有再次绘制文本,所以你只能看到文本闪一下就没了。

修复方案

我们需要一个状态变量来标记是否要显示文本,当定时器事件触发时,把这个状态设为True,之后每帧都根据这个状态来绘制文本,这样就能让内容持续显示了。

修改后的完整代码如下:

import pygame
pygame.init()
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Test Run")

# Heading
headingfont = pygame.font.Font('Bouncy-PERSONAL_USE_ONLY.otf', 45)
headingX = 230
headingY = 10

class Other():
    def show_heading():
        Heading = headingfont.render("Health Run!", True, (255, 255, 255))
        screen.blit(Heading, (headingX, headingY))

# 添加状态变量:标记是否显示标题
show_heading = False
# 设置100ms后触发一次USEREVENT
pygame.time.set_timer(pygame.USEREVENT, 100)

running = True
while running:
    screen.fill((0,0,0))
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.USEREVENT:
            show_heading = True
            # 如果只需要触发一次显示,取消定时器避免重复触发
            pygame.time.set_timer(pygame.USEREVENT, 0)
    
    # 只要状态为True,每帧都绘制标题
    if show_heading:
        Other.show_heading()
    
    pygame.display.update()

关键修改点

  • 添加show_heading布尔变量,作为是否显示文本的开关
  • 触发USEREVENT时仅切换状态变量,不再直接绘制文本
  • 在主循环的绘制阶段,根据状态变量持续绘制文本
  • 可选优化:如果只需要单次延迟显示,触发后调用pygame.time.set_timer(pygame.USEREVENT, 0)取消定时器,避免重复触发

这样修改后,延迟100ms后文本就会一直显示在屏幕上,直到你关闭窗口啦!

内容的提问来源于stack exchange,提问作者Santa Claus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 10:42:40