【问题标题】:Python Pygame mouse position not updatingPython Pygame鼠标位置未更新
【发布时间】:2018-04-23 02:35:23
【问题描述】:

我正在尝试使用鼠标位置来实现游戏,以查看用户是否单击按钮。不知何故,鼠标位置不会更新几秒钟,然后再改变几秒钟,然后重复。我在屏幕的不同位置移动并按下鼠标,但鼠标位置根本没有改变。 (在 python3.5.1 和 pygame 1.9.2 上工作,使用 IDE PyCharm)知道吗? 这是我的代码:

done = False
while not done:
   for event in pygame.event.get():
       if event.type == pygame.QUIT:
           done = True
   mouse = pygame.mouse.get_pos()
   click = pygame.mouse.get_pressed()
   if click[0]==1:
        print(mouse)
   pygame.display.update()

【问题讨论】:

  • 你是在 pygame 窗口内点击吗?

标签: python pygame mouseevent mouse-position


【解决方案1】:

电话

mouse = pygame.mouse.get_pos()

除非事件MouseMotion 被执行,否则不会更新位置。

如果您在 MAC 上的窗口中执行程序,则必须按住鼠标并移动鼠标(如果您要按住鼠标然后移动鼠标,pygame.mouse.get_pos() 将返回当前鼠标位置) .

【讨论】:

  • 真的吗?为什么在文档中没有说明这种行为? pygame.org/docs/ref/mouse.html#pygame.mouse.get_pos 我可以确认它按照您的描述工作。这种行为在 Windows 机器上是否有所不同?
  • 我正在使用带有 Replit 的 python 在线更新,我该如何更新它?
【解决方案2】:

在pygame中有两种处理输入事件的方法:

  • 状态检查
  • 事件处理

为了更好地理解它的工作原理: http://www.pygame.org/docs/tut/newbieguide.html#managing-the-event-subsystem

您在代码中同时使用两者,状态检查:

mouse = pygame.mouse.get_pos()
click = pygame.mouse.get_pressed()

事件处理:

for event in pygame.event.get():
       if event.type == pygame.QUIT:
           done = True

如果您仍想使用状态检查来获取鼠标位置,您可以添加:

clock=pygame.time.Clock()
clock.tick(60) # 60 frames per second

所以位置的更新应该比较好。

【讨论】:

  • 谢谢!我添加了时钟,但鼠标位置仍然变化非常缓慢。还有什么问题?
【解决方案3】:

如果按钮有一个矩形,那么您可以使用 rect.collidepoint() 方法进行事件检查,如下所示:

mouse_pos = pygame.mouse.get_pos()

    if event.type == pygame.MOUSEBUTTONDOWN and pygame.mouse.get_pressed()[0] and button.rect.collidepoint(mouse_pos):

【讨论】:

    【解决方案4】:

    这让我发疯了好几个小时。我有一个类似的问题。 在中使用 pygame:

    Mac OSX 10.13 (High Sierra) pygame 1.9.3 蟒蛇3.6 在虚拟环境中

    在此设置中(特别是在 virtualenv 中),没有正确跟踪窗口焦点。单击并拖动会产生一个 MOUSEMOTION 事件,但简单地移动鼠标不会。如果没有产生 MOUSEMOTION 事件,调用:

    pos = pygame.mouse.get_pos()
    

    将继续报告相同的值,直到发生另一个 MOUSEMOTION 事件。

    在 virtualenv 之外安装 pygame,一切正常。并不是我真正希望的答案,但至少它解释了我所看到的行为。

    【讨论】:

      【解决方案5】:

      你的

      mouse = pygame.mouse.get_pos()
      click = pygame.mouse.get_pressed()
      

      仅获取通话时的状态。根据文档http://www.pygame.org/docs/ref/mouse.html:

      要获取所有鼠标事件,最好使用 pygame.event.wait() 或 pygame.event.get() 并检查所有这些事件

      那是您错过了点击,因为您的程序没有存储它们以进行处理。您只有在幸运时才能看到它,并且当按钮实际按下时程序会调用该函数。

      【讨论】:

      • 我更改了我的代码:对于 pygame.event.get() 中的事件:如果 event.type == pygame.MOUSEBUTTONDOWN: pos = pygame.mouse.get_pos().. 我仍然有同样的问题。
      【解决方案6】:

      这显示了一个基本的 pygame 鼠标获取程序。只需单击窗口中的任意位置即可打印鼠标坐标:

      import pygame as py
      
      py.init()
      
      white = (255,255,255)
      
      window = (400,400)
      screen = py.display.set_mode(window)
      
      clock = py.time.Clock()
      
      done = False
      while not done:
          for event in py.event.get():
              if event.type == py.QUIT:
                  done = True
              elif event.type == py.MOUSEBUTTONDOWN:
                  print py.mouse.get_pos()
          screen.fill(white)
          py.display.flip()
          clock.tick(30)
      
      py.quit()
      

      希望这会有所帮助:)

      【讨论】:

      • 你知道为什么这个确切的代码不能通过 OS X El Capitan 上的 Anaconda 在 Python 3.5.2 上的 PyGame 1.9.2a0 上正常工作吗?它“有效”,但只有在我反复单击并移动鼠标时才会更新鼠标位置。否则,无论我点击哪里,它都会一直报告相同的位置。有关行为的 gif,请参见此处:link
      猜你喜欢
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 2018-07-30
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多