'PyGame - Can't hide mouse

I've read everything I could find about the mouse in pygame and yet I miss something.

The device has (and will not) have a mouse attached so I need to remove the cursor from the game surface, ideally even before it draws the first screen.

But no matter what I try I always have a big oppalin cursor in the middle of the screen.

My current function is this :

  # initialize the pygame module
  pygame.init()
    
  # create a surface on screen that has the size of 240 x 180
  screen = pygame.display.set_mode((160,80))

  # define a variable to control the main loop
  running = True
  
  pygame.display.flip()

  # main loop
  while running:

    screen.fill((0, 0, 0))
    # hide cursor
    pygame.mouse.set_pos((160,80)) # my screen is actually 160 x 80 px so this should hide it by pushing it over the edge
    pygame.mouse.set_visible(False) # this should hide the mouse plain and simple

    # Here I do other unrelated (but working) stuff, like displaying images and text

    # event handling, gets all event from the event queue
    for event in pygame.event.get():
      # only do something if the event is of type QUIT
      if event.type == pygame.QUIT:
        # change the value to False, to exit the main loop
        running = False
    
    pygame.display.flip()

And the mouse is still on screen, sometimes after a while it disappears.

I tried other method like making the cursor transparent, but that crash the app.

Note that I'm running Pygame on an Alpine Linux with direct output to the framebuffer on a Raspberry Pi. There's no mouse attached to the device but if I connect one I can move the cursor around.

Pygame is Version 2.1.2 (compiled and installed by pip) Python is 3.10.0

Any help or pointer would be greatly appreciated.

(sorry if it's a dumb question; I'm a total noob with python/pygame)



Solution 1:[1]

Just write the set_visible(False) outside the main loop, you don't need to call this every frame:

  pygame.init()

  screen = pygame.display.set_mode((160,80))

  pygame.mouse.set_visible(False) # Hide cursor here

  running = True
 
  pygame.display.flip()

  # main loop
  while running:
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
        running = False
 
    # unrelated with your question but I also suggest that you clear your background inside the loop, at the contrary you likely will need this at each frame
    screen.fill((0, 0, 0))
    # ... your code, blitting images etc
    pygame.display.flip()

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Peterrabbit