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

PyGame中鼠标按下与松开间秒表计时异常问题求助

解决Pygame秒表无法停止的问题

你的代码问题出在两个关键地方:

  • 嵌套的while循环里只获取了一次事件,之后没有持续更新事件状态,导致永远检测不到MOUSEBUTTONUP
  • time.sleep(1)会阻塞整个程序,在休眠期间Pygame无法处理任何鼠标事件,自然没法及时响应松开操作

下面是修正后的代码,能实现按住鼠标计时、松开停止的功能:

from pygame import *
import time

init()  # 别忘了初始化Pygame!
screen = display.set_mode((160, 90))
sec = 0
is_timing = False  # 状态变量:标记是否正在计时
clock = Clock()  # 用Pygame时钟来控制计时和帧率

while True:
    # 处理所有事件(而不是只poll一次)
    for e in event.get():
        if e.type == QUIT:
            quit()
            exit()
        if e.type == MOUSEBUTTONDOWN:
            sec = 0  # 按下鼠标时重置秒数
            is_timing = True
        if e.type == MOUSEBUTTONUP:
            is_timing = False  # 松开鼠标时停止计时

    # 只有在计时状态下才更新秒数
    if is_timing:
        # 用时钟控制每秒更新一次(这里用get_time()计算时间差更准确)
        sec += clock.get_time() / 1000  # 将毫秒转为秒
        # 打印整数秒数(或者根据需求保留小数)
        print(int(sec))
    
    display.update()
    clock.tick(60)  # 保持60帧每秒,确保事件处理流畅

关键改动说明:

  • 状态变量is_timing:代替嵌套循环,用这个变量控制是否在主循环里进行计时操作,避免阻塞事件处理
  • event.get()遍历所有事件:确保每次循环都处理所有待处理的事件,不会漏掉鼠标松开的信号
  • Clock()计时:用get_time()获取两次循环之间的时间差,比time.sleep更准确,而且不会阻塞事件循环,保证程序能及时响应鼠标操作
  • 初始化Pygame:原代码漏掉了init(),这是Pygame运行的必要步骤

这样修改后,按住鼠标时秒表会持续计时,松开鼠标就立刻停止,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:18:28