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()记录时间差,在主循环中判断是否达到延迟时长,这样不会阻塞渲染和事件处理。
修改步骤:
在全局/类中添加两个状态变量:
# 记录延迟开始的时间(毫秒) delay_start = 0 # 标记是否处于等待延迟的状态 waiting_for_delay = False修改两张卡片点击后的逻辑:
if example.clicked and example2.clicked and not waiting_for_delay: # 开启延迟等待,记录当前时间 waiting_for_delay = True delay_start = pygame.time.get_ticks()在主循环的渲染逻辑后,添加延迟判断:
# 主循环内 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确保主循环中每次迭代都调用
pygame.display.update()或pygame.display.flip(),这样卡片的移动会立即被绘制到屏幕上。
为什么这样有效?
pygame.time.get_ticks()返回的是Pygame初始化以来的毫秒数,不会阻塞主线程。主循环依然在正常运行,卡片的位置更新会被及时渲染,等延迟时间到了再执行删除操作,就能看到预期的“先上移,1秒后删除归位”的效果。
内容的提问来源于stack exchange,提问作者Basic c0der
相关产品推荐
相关产品推荐

