pygame中timer不显示文本,3秒倒计时仅等待后直接进入游戏如何修复
问题核心原因
- 进入倒计时循环时
start变量初始为False,你写的if start:判断直接跳过了文本渲染逻辑,自然不会显示任何倒计时文本 time.sleep(1)会完全阻塞pygame主线程,即使渲染了文本也会因为线程阻塞无法正常刷新到窗口- 没有在绘制倒计时前清空窗口背景,之前的界面元素会直接覆盖住倒计时文本
- 你把倒计时循环写在了鼠标点击事件的判断分支内,会阻塞整个pygame的事件队列处理,大概率会触发窗口假死
修复后的代码示例
def main_menu(): start = False start_in = 3 clock = py.time.Clock() # 可根据需求调整字体大小、样式 start_font = py.font.SysFont(None, 100) running = True while running: # 每次渲染前先清空窗口背景,可替换为你自己的背景色 WIN.fill((0, 0, 0)) for event in py.event.get(): if event.type == py.QUIT: running = False py.quit() exit() if event.type == py.MOUSEBUTTONDOWN and not start: start = True # 记录倒计时开始的时间戳,不用sleep阻塞线程 count_down_start = py.time.get_ticks() if start and start_in > 0: # 计算已经过去的秒数 elapsed = (py.time.get_ticks() - count_down_start) // 1000 if elapsed >= 1: start_in -= 1 count_down_start = py.time.get_ticks() # 渲染并绘制倒计时文本 start_label = start_font.render(str(start_in), True, (255,255,255)) WIN.blit(start_label, (WIDTH/2 - start_label.get_width()/2, HEIGHT/2)) # 倒计时结束进入主游戏 if start_in == 0: main() py.display.update() # 控制窗口帧率为60 clock.tick(60)
关键修改说明
- 去掉了阻塞线程的
time.sleep(1),改用pygame内置的时间函数py.time.get_ticks()计算时间差实现倒计时,不会阻塞界面刷新 - 移除了错误的
if start:渲染判断,只要处于倒计时阶段就会正常渲染文本 - 每次循环先清空窗口背景,避免旧内容覆盖倒计时
- 把倒计时逻辑放到主事件循环内,不会阻塞事件处理,窗口不会出现假死问题
内容的提问来源于stack exchange,提问作者Dependra Khatri
相关产品推荐
相关产品推荐

