简体   繁体   中英

Python Pygame mouse position not updating

I am trying to implement a game using mouse position to see if the user clicks a button. Somehow the mouse position does not update for a couple seconds, and changes to a new position for another couple seconds, and repeat. I moved and pressed the mouse at different location in the screen, but the mouse position did not change at all. (Working on python3.5.1 and pygame 1.9.2, using IDE PyCharm)Any idea? Here is my code:

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()

The call

mouse = pygame.mouse.get_pos()

doesn't update the position unless the event MouseMotion is executed.

If you are executing the program in a window on a MAC, the mouse must be pressed, held, and moved (if you were to press, hold, then move the mouse, pygame.mouse.get_pos() would return the current mouse position).

There is two ways of handling input events in pygame :

  • State Checking
  • Event Handling

For better understanding of how it works : http://www.pygame.org/docs/tut/newbieguide.html#managing-the-event-subsystem

You use both in your code, state checking :

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

Event handling :

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

If you still want to use state checking to get the mouse position you can add:

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

So the update of the position should be better.

If the button has a rect then you can use the rect.collidepoint() method with event checking like this:

mouse_pos = pygame.mouse.get_pos()

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

This drove me crazy for hours. I had a similar problem. Using pygame in:

Mac OSX 10.13 (High Sierra) pygame 1.9.3 python 3.6 in a virtualenv

In this setup (specifically in the virtualenv), window focus is not properly tracked. Click and dragging will generate a MOUSEMOTION event, but simply moving the mouse around will not. If the MOUSEMOTION event is not generated, calling:

pos = pygame.mouse.get_pos()

will continue report the same value until another MOUSEMOTION event occurs.

Installing pygame outside of the virtualenv, all works as expected. Not really the answer I was hoping for, but at least it explains the behavior I was seeing.

Your

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

only get the states at the time of the call . As per the documentation http://www.pygame.org/docs/ref/mouse.html :

to get all of the mouse events it is better to use either pygame.event.wait() or pygame.event.get() and check all of those events

That is you are missing the clicks because your program isn't storing them to process. You only see it when you get lucky and the program calls the function when the button is actually down.

This shows a basic pygame mouse getting program. Simply click anywhere in the window and the mouse coordinate are printed:

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()

hope this helps :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM