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

Python Pygame中time.sleep提前执行问题及解决方法

Pygame中time.sleep导致画面不刷新的问题解决

问题根源

Pygame的事件循环、渲染逻辑都运行在单主线程中,time.sleep()会直接阻塞整个线程。当你点击第二张卡片后,代码先执行time.sleep(1),此时卡片的rect.y更新(上移)还没来得及被pygame.display.update()/flip()绘制到屏幕上,线程就暂停了。等睡眠结束后,直接执行删除操作,所以你看不到第二张卡片的移动效果。

正确解决方案:用Pygame时间API实现非阻塞延迟

放弃time.sleep(),改用pygame.time.get_ticks()记录时间差,在主循环中判断是否达到延迟时长,这样不会阻塞渲染和事件处理。

修改步骤:

  1. 在全局/类中添加两个状态变量:

    # 记录延迟开始的时间(毫秒)
    delay_start = 0
    # 标记是否处于等待延迟的状态
    waiting_for_delay = False
    
  2. 修改两张卡片点击后的逻辑:

    if example.clicked and example2.clicked and not waiting_for_delay:
        # 开启延迟等待,记录当前时间
        waiting_for_delay = True
        delay_start = pygame.time.get_ticks()
    
  3. 在主循环的渲染逻辑后,添加延迟判断:

    # 主循环内
    if waiting_for_delay:
        # 检查是否已经过了1000毫秒(1秒)
        if pygame.time.get_ticks() - delay_start >= 1000:
            # 执行删除和归位操作
            hp -= 5
            image_clickables.remove(example)
            image_clickables.remove(example2)
            # 调用你的delete函数重置卡片状态
            delete(example, example2)
            # 重置延迟状态
            waiting_for_delay = False
    
  4. 确保主循环中每次迭代都调用pygame.display.update()或pygame.display.flip(),这样卡片的移动会立即被绘制到屏幕上。

为什么这样有效?

pygame.time.get_ticks()返回的是Pygame初始化以来的毫秒数,不会阻塞主线程。主循环依然在正常运行,卡片的位置更新会被及时渲染,等延迟时间到了再执行删除操作,就能看到预期的“先上移,1秒后删除归位”的效果。


内容的提问来源于stack exchange,提问作者Basic c0der

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:32:48