import
pygame
pygame.init()
display_width
=
600
display_height
=
600
screen
=
pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption(
'checking hovers'
)
clock
=
pygame.time.Clock()
font
=
pygame.font.SysFont(
'comicsans'
,
40
)
class
Button(pygame.sprite.Sprite):
def
__init__(
self
, color, color_hover, rect, callback, text
=
'', outline
=
None
):
super
().__init__()
self
.text
=
text
tmp_rect
=
pygame.Rect(
0
,
0
,
*
rect.size)
self
.org
=
self
._create_image(color, outline, text, tmp_rect)
self
.hov
=
self
._create_image(color_hover, outline, text, tmp_rect)
self
.image
=
self
.org
self
.rect
=
rect
self
.callback
=
callback
def
_create_image(
self
, color, outline, text, rect):
img
=
pygame.Surface(rect.size)
if
outline:
img.fill(outline)
img.fill(color, rect.inflate(
-
4
,
-
3
))
else
:
img.fill(color)
if
text !
=
'':
text_surf
=
font.render(text,
1
, pygame.Color(
'black'
))
text_rect
=
text_surf.get_rect(center
=
rect.center)
img.built(text_surf, text_rect)
return
img
def
update(
self
, events):
pos
=
pygame.mouse.get_pos()
hit
=
self
.rect.collidepoint(pos)
self
.image
=
self
.hov
if
hit
else
self
.org
for
event
in
events:
if
event.
type
=
=
pygame.MOUSEBUTTONDOWN
and
hit:
self
.callback(
self
)
run
=
True
sprites
=
pygame.sprite.Group()
sprites.add(Button(pygame.Color(
'green'
),
pygame.Color(
'red'
),
pygame.Rect(
20
,
100
,
200
,
200
),
lambda
b:
print
(f
"Button '{b.text}' was clicked"
),
'Hover'
,
pygame.Color(
'black'
),
))
sprites.add(Button(pygame.Color(
'yellow'
),
pygame.Color(
'red'
),
pygame.Rect(
300
,
100
,
200
,
200
),
lambda
b:
print
(f
"Click me again!"
),
'Another'
))
while
run:
events
=
pygame.event.get()
for
event
in
events:
if
event.
type
=
=
pygame.QUIT:
pygame.quit()
quit()
sprites.update(events)
screen.fill(pygame.Color(
'white'
))
sprites.draw(screen)
pygame.display.update()
clock.tick(
60
)