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

如何设置定时器关闭一个Pygame函数后启动另一个函数?

解决Pygame中20秒后切换函数的问题

你的核心问题在于两个函数都是独立的while True死循环,一旦进入其中一个,程序就卡在里面没法切换;而time.wait这类方法会阻塞主循环,导致事件处理和渲染停摆。不用线程/多进程,用状态机+时间追踪就能轻松解决,具体步骤如下:

修改思路

  1. 把两个函数里的逻辑拆出来,放到主循环中,用状态变量控制当前执行哪块代码
  2. 用pygame.time.get_ticks()记录起始时间,实时计算是否达到20秒的切换条件
  3. 统一在主循环处理事件,避免分散处理导致的问题

完整代码示例

import pygame
import sys
import gif_pygame

# 初始化Pygame和基础设置
pygame.init()
screen = pygame.display.set_mode((400, 300))
text_font = pygame.font.Font(None, 36)
example_gif = gif_pygame.load("giphy (1).gif")

# 状态控制变量:初始显示GIF
current_state = "show_gif"
# 记录状态开始的时间(单位:毫秒)
start_time = pygame.time.get_ticks()
# 20秒的超时阈值(转成毫秒)
SWITCH_TIMEOUT = 20000

def crt_shader():
    # 假设这是你的CRT shader实现
    pass

def render_text(text, font, color, x, y):
    # 假设这是你的文本渲染函数
    text_surface = font.render(text, True, color)
    screen.blit(text_surface, (x, y))

# 主循环
while True:
    # 统一处理所有事件,避免漏处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    
    # 检查是否到达切换时间
    if current_state == "show_gif":
        elapsed_time = pygame.time.get_ticks() - start_time
        if elapsed_time >= SWITCH_TIMEOUT:
            current_state = "show_question"
    
    # 根据当前状态执行对应逻辑
    if current_state == "show_gif":
        example_gif.render(screen, (200 - example_gif.get_width() * 0.5, 150 - example_gif.get_height() * 0.5))
        crt_shader()
    elif current_state == "show_question":
        # screen.fill((255,255,255))  # 如需背景填充可取消注释
        render_text("Teste Teste", text_font, (255,255,255), 0, 0)
        crt_shader()
    
    # 更新屏幕显示(必须有,否则内容不会刷新)
    pygame.display.flip()

关键说明

  • 状态变量current_state控制当前执行哪部分逻辑,切换时只需改变这个变量的值
  • pygame.time.get_ticks()返回从Pygame初始化到现在的毫秒数,用来计算已流逝的时间,不会阻塞主循环
  • 事件处理统一放在主循环开头,确保无论处于哪个状态,都能响应退出等事件
  • 原来的两个函数里的while True被移除,逻辑整合到主循环的分支中,保证程序能正常切换状态

内容的提问来源于stack exchange,提问作者Douglas Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:00:22