Mouseover en Pygame

Sé que este título suena muy parecido a Detectar el mouse sobre una imagen en Pygame pero hay un error. He intentado seguir las dos respuestas de esa pregunta, pero nunca funcionó. Aquí hay una parte de mi código:

title = font3.render(('SQUASH!'), True, white) play = font1.render(('PLAY'), True, white) while True: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() screen.blit((title), (400, 400)) screen.blit(play, (theposition)) if play.collide_point(pygame.mouse.get_pos()): hi = font1.render(('hi'), True, white) screen.blit(hi, (300, 300)) pygame.display.flip() time.sleep(0.000000000000000000000000000000000000000000000000000000001) pygame.display.flip() 

El ‘hola’ es básicamente una prueba que usa la primera respuesta. Estoy intentando hacer que el texto cambie (en negrita, subrayado, etc.) si paso el mouse sobre un botón. No parece funcionar.

Aquí hay un código de ejemplo:

 import pygame from pygame.locals import * import time if __name__ == "__main__": pygame.init() size = (700, 700) screen = pygame.display.set_mode(size) font = pygame.font.SysFont('Impact',20,16) title = font.render(('SQUASH!'), True, (255,255,255)) play = font.render(('PLAY'), True, (255,255,255)) play_r = play.get_rect() play_r.x, play_r.y = 300,300 while True: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() screen.fill((0,255,0,)) screen.blit(title, (400, 400)) screen.blit(play, (300,300)) if play_r.collidepoint(pygame.mouse.get_pos()): print 'Detected' time.sleep(0.000000000000000000000000000000000000000000000000000000001) pygame.display.flip() 

tienes que crear un punto de acceso para saber exactamente dónde se encuentra el texto, saber que hay un rect que usas collidepoint() y ahora, cuando collidepoint() mouse sobre el texto, se imprimirá Detectado en la consola

Aquí hay un ejemplo de ejecución con explicaciones en los comentarios:

 import pygame pygame.init() screen = pygame.display.set_mode((200, 200)) # the 'normal' font base_font = pygame.font.SysFont('Arial', 20, 16) # the 'mouse-over' font mod_font = pygame.font.SysFont('Arial', 20, 16) mod_font.set_underline(True) # always use some kind of cache when rendering font # font rendering is very expensive, and it *will* # slow down your application if you render some text cache = {} def render(text, mod=False): if not mod in cache: cache[mod] = {} if not text in cache[mod]: cache[mod][text] = (mod_font if mod else base_font).render(text, True, (255, 255, 255)) return cache[mod][text] # create a list of (text, Rect)-tuples x, y = 10, 20 objetcs = [(t, render(t).get_rect()) for t in ('Hi', 'please', 'click', 'me')] # just move some objects around for (_, r) in objetcs: r.top, r.left = y, x x *= 2 y += 35 # always use a Clock to keep your framerate constant clock = pygame.time.Clock() run = True while run: # clear the screen screen.fill((0, 0, 0)) # draw all objects for (t, r) in objetcs: # decide if we want to render the text with or without the underline # based on the result of collidepoint(pygame.mouse.get_pos()) # note that collidepoint is a method of Rect, not Surface screen.blit(render(t, r.collidepoint(pygame.mouse.get_pos())), r) # check which item is clicked if pygame.event.get(pygame.MOUSEBUTTONDOWN): # calling 'render' over and over again is cheap now, since the resut is cached for text in [t for (t, r) in objetcs if r.collidepoint(pygame.mouse.get_pos())]: print "'{}' was clicked".format(text) # draw the screen ONCE pygame.display.flip() if pygame.event.get(pygame.QUIT): run = False # clear all unwanted events pygame.event.clear() clock.tick(60) 

introduzca la descripción de la imagen aquí