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

调用mouse.set_visible(False)后mouse.set_pos不生效、mouse.get_pos返回异常问题

问题根因

这是Pygame隐藏系统光标后的已知底层行为:调用mouse.set_visible(False)后,Pygame会进入相对鼠标输入的内部逻辑,此时mouse.get_pos()默认读取的是事件队列中缓存的鼠标坐标,而非系统光标实时位置。mouse.set_pos()修改的是系统级光标位置,该改动必须等下一次事件队列刷新(调用pygame.event.pump()或完成一轮事件处理)后,才会同步到mouse.get_pos()的返回值中,隐藏光标后该同步的触发条件会比光标可见时更严格。

可行解决方案

  • 调用mouse.set_pos()后主动刷新事件队列,示例修改如下:
mouse.set_pos(screen.get_width() / 2, screen.get_height() / 2)
pygame.event.pump() # 主动刷新事件队列同步光标状态
start_pos = (screen.get_width() / 2, screen.get_height() / 2)
print(mouse.get_pos() == start_pos)
  • 自行维护自定义光标坐标:既然你已经要实现自定义光标,完全可以声明一个独立变量存储光标坐标,监听MOUSEMOTION事件时更新该变量,渲染阶段直接用该变量绘制自定义光标图片,绕开mouse.get_pos()的同步问题,性能也更优。
  • 替换透明光标替代隐藏光标:不使用mouse.set_visible(False),而是将系统光标替换为完全透明的自定义光标,该模式下mouse.get_pos()、mouse.set_pos()的行为和光标可见时完全一致,不会出现同步异常。示例代码:
# 生成1x1尺寸的透明光标
transparent_surf = pygame.Surface((1, 1), pygame.SRCALPHA)
transparent_cursor = pygame.cursors.Cursor((0, 0), transparent_surf)
pygame.mouse.set_cursor(transparent_cursor)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:45:01