如何设置定时器关闭一个Pygame函数后启动另一个函数?
解决Pygame中20秒后切换函数的问题
你的核心问题在于两个函数都是独立的while True死循环,一旦进入其中一个,程序就卡在里面没法切换;而time.wait这类方法会阻塞主循环,导致事件处理和渲染停摆。不用线程/多进程,用状态机+时间追踪就能轻松解决,具体步骤如下:
修改思路
- 把两个函数里的逻辑拆出来,放到主循环中,用状态变量控制当前执行哪块代码
- 用
pygame.time.get_ticks()记录起始时间,实时计算是否达到20秒的切换条件 - 统一在主循环处理事件,避免分散处理导致的问题
完整代码示例
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
相关产品推荐
相关产品推荐

