#!/usr/bin/env python """ pygame.examples.cursors Click a button and the cursor will change. This example will show you: *The different types of cursors that exist *How to create a cursor *How to set a cursor *How to make a simple button """ import pygame as pg import os # Create a system cursor system_cursor1 = pg.SYSTEM_CURSOR_CROSSHAIR system_cursor2 = pg.SYSTEM_CURSOR_HAND system_cursor3 = pg.SYSTEM_CURSOR_IBEAM # Create a color cursor surf = pg.Surface((40, 40)) surf.fill((120, 50, 50)) color_cursor = pg.cursors.Cursor((20, 20), surf) # Create a color cursor with an image surface main_dir = os.path.split(os.path.abspath(__file__))[0] image_name = os.path.join(main_dir, "data", "cursor.png") image = pg.image.load(image_name) image_cursor = pg.cursors.Cursor( (image.get_width() // 2, image.get_height() // 2), image ) # Create a bitmap cursor from simple strings # sized 24x24 thickarrow_strings = ( "XX ", "XXX ", "XXXX ", "XX.XX ", "XX..XX ", "XX...XX ", "XX....XX ", "XX.....XX ", "XX......XX ", "XX.......XX ", "XX........XX ", "XX........XXX ", "XX......XXXXX ", "XX.XXX..XX ", "XXXX XX..XX ", "XX XX..XX ", " XX..XX ", " XX..XX ", " XX..XX ", " XXXX ", " XX ", " ", " ", " ", ) bitmap_cursor1 = pg.cursors.Cursor( (24, 24), (0, 0), *pg.cursors.compile(thickarrow_strings, black="X", white=".", xor="o"), ) # Create a bitmap cursor from premade simple strings bitmap_cursor2 = pg.cursors.diamond # Calculate if mouse position is inside circle def check_circle(mouse_pos_x, mouse_pos_y, center_x, center_y, radius): return (mouse_pos_x - center_x) ** 2 + (mouse_pos_y - center_y) ** 2 < radius**2 def main(): pg.init() pg.display.set_caption("Cursors Example") pg.font.init() font = pg.font.Font(None, 30) font1 = pg.font.Font(None, 24) bg = pg.display.set_mode((500, 400)) bg.fill((183, 201, 226)) # Initialize circles radius1 = 40 radius2 = 40 radius3 = 40 radius4 = 40 radius5 = 40 radius6 = 40 radius7 = 40 pos_x1 = 82 pos_x2 = 138 pos_x3 = 194 pos_x4 = 250 pos_x5 = 306 pos_x6 = 362 pos_x7 = 418 pos_y1 = 140 pos_y2 = 220 pos_y3 = 140 pos_y4 = 220 pos_y5 = 140 pos_y6 = 220 pos_y7 = 140 circle1 = pg.draw.circle(bg, (255, 255, 255), (pos_x1, pos_y1), radius1) circle2 = pg.draw.circle(bg, (255, 255, 255), (pos_x2, pos_y2), radius2) circle3 = pg.draw.circle(bg, (255, 255, 255), (pos_x3, pos_y3), radius3) circle4 = pg.draw.circle(bg, (255, 255, 255), (pos_x4, pos_y4), radius4) circle5 = pg.draw.circle(bg, (255, 255, 255), (pos_x5, pos_y5), radius5) circle6 = pg.draw.circle(bg, (255, 255, 255), (pos_x6, pos_y6), radius6) circle7 = pg.draw.circle(bg, (255, 255, 255), (pos_x7, pos_y7), radius7) # Initialize button button_text = font1.render("Click here to change cursor", True, (0, 0, 0)) button = pg.draw.rect( bg, (180, 180, 180), (139, 300, button_text.get_width() + 5, button_text.get_height() + 50), ) button_text_rect = button_text.get_rect(center=button.center) bg.blit(button_text, button_text_rect) pg.display.update() cursors = [ system_cursor1, color_cursor, system_cursor2, image_cursor, system_cursor3, bitmap_cursor1, bitmap_cursor2, ] index = 0 pg.mouse.set_cursor(cursors[index]) pressed = False clock = pg.time.Clock() while True: clock.tick(50) mouse_x, mouse_y = pg.mouse.get_pos() # Check if mouse is inside a circle to change its color if check_circle(mouse_x, mouse_y, circle1.centerx, circle1.centery, radius1): circle1 = pg.draw.circle(bg, (255, 0, 0), (pos_x1, pos_y1), radius1) else: circle1 = pg.draw.circle(bg, (255, 255, 255), (pos_x1, pos_y1), radius1) if check_circle(mouse_x, mouse_y, circle2.centerx, circle2.centery, radius2): circle2 = pg.draw.circle(bg, (255, 127, 0), (pos_x2, pos_y2), radius2) else: circle2 = pg.draw.circle(bg, (255, 255, 255), (pos_x2, pos_y2), radius2) if check_circle(mouse_x, mouse_y, circle3.centerx, circle3.centery, radius3): circle3 = pg.draw.circle(bg, (255, 255, 0), (pos_x3, pos_y3), radius3) else: circle3 = pg.draw.circle(bg, (255, 255, 255), (pos_x3, pos_y3), radius3) if check_circle(mouse_x, mouse_y, circle4.centerx, circle4.centery, radius3): circle4 = pg.draw.circle(bg, (0, 255, 0), (pos_x4, pos_y4), radius4) else: circle4 = pg.draw.circle(bg, (255, 255, 255), (pos_x4, pos_y4), radius4) if check_circle(mouse_x, mouse_y, circle5.centerx, circle5.centery, radius4): circle5 = pg.draw.circle(bg, (0, 0, 255), (pos_x5, pos_y5), radius5) else: circle5 = pg.draw.circle(bg, (255, 255, 255), (pos_x5, pos_y5), radius5) if check_circle(mouse_x, mouse_y, circle6.centerx, circle6.centery, radius6): circle6 = pg.draw.circle(bg, (75, 0, 130), (pos_x6, pos_y6), radius6) else: circle6 = pg.draw.circle(bg, (255, 255, 255), (pos_x6, pos_y6), radius6) if check_circle(mouse_x, mouse_y, circle7.centerx, circle7.centery, radius7): circle7 = pg.draw.circle(bg, (148, 0, 211), (pos_x7, pos_y7), radius7) else: circle7 = pg.draw.circle(bg, (255, 255, 255), (pos_x7, pos_y7), radius7) bg.fill((183, 201, 226), (0, 15, bg.get_width(), 50)) text1 = font.render( (f"This is a {pg.mouse.get_cursor().type} cursor"), True, (0, 0, 0) ) text_rect1 = text1.get_rect(center=(bg.get_width() / 2, 40)) bg.blit(text1, text_rect1) button = pg.draw.rect( bg, (100, 149, 240), (139, 300, button_text.get_width() + 5, button_text.get_height() + 50), ) bg.blit(button_text, button_text_rect) # Check if button was clicked and change cursor if button.collidepoint(mouse_x, mouse_y): button = pg.draw.rect( bg, (60, 100, 255), ( 139, 300, button_text.get_width() + 5, button_text.get_height() + 50, ), ) bg.blit(button_text, button_text_rect) if pg.mouse.get_pressed()[0] == 1 and pressed == False: button = pg.draw.rect( bg, (0, 0, 139), ( 139, 300, button_text.get_width() + 5, button_text.get_height() + 50, ), ) bg.blit(button_text, button_text_rect) index += 1 index %= len(cursors) pg.mouse.set_cursor(cursors[index]) pg.display.update() pg.time.delay(40) if pg.mouse.get_pressed()[0] == 1: pressed = True elif pg.mouse.get_pressed()[0] == 0: pressed = False for event in pg.event.get(): if event.type == pg.QUIT: pg.quit() raise SystemExit pg.display.update() if __name__ == "__main__": main()