From d1dc241213780524d2795500c53a55f133e2e50f Mon Sep 17 00:00:00 2001 From: Junior Date: Wed, 5 Jun 2024 18:54:23 -0400 Subject: [PATCH] Handle mouse clicks on buttons. Change button background color. --- PyGame/Calculator/calc.py | 59 +++++++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/PyGame/Calculator/calc.py b/PyGame/Calculator/calc.py index 51abf5e..40c8f96 100644 --- a/PyGame/Calculator/calc.py +++ b/PyGame/Calculator/calc.py @@ -1,5 +1,6 @@ from dataclasses import dataclass from datetime import datetime +import math import os os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide" import pygame @@ -26,6 +27,7 @@ button_origin_x = 90 button_origin_y = 280 button_spacing = 140 button_radius = 50 +button_background = (60, 60, 60) @dataclass class Button: @@ -122,7 +124,7 @@ def flash_button(b): center_x = button_origin_x + (b.column * button_spacing) center_y = button_origin_y + (b.row * button_spacing) center = (center_x, center_y) - pygame.draw.circle(screen, background, center, button_radius, 4) + pygame.draw.circle(screen, button_background, center, button_radius, 4) pygame.draw.circle(screen, yellow, center, button_radius, 2) b.flashing = False @@ -132,6 +134,7 @@ def draw_buttons(): b.center_x = button_origin_x + (b.column * button_spacing) b.center_y = button_origin_y + (b.row * button_spacing) center = (b.center_x, b.center_y) + pygame.draw.circle(screen, button_background, center, button_radius) pygame.draw.circle(screen, yellow, center, button_radius, 2) b_text = cheesy_font.render(b.label, True, white) text_x = b.center_x - (b_text.get_width() // 2) @@ -164,31 +167,41 @@ while True: if event.type == pygame.QUIT: pygame.quit() sys.exit() - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: + mouse_click = None + if event.type == pygame.MOUSEBUTTONDOWN: + mouse_x, mouse_y = pygame.mouse.get_pos() + for key, b in buttons.items(): + if math.hypot(mouse_x - b.center_x, mouse_y - b.center_y) <= button_radius: + mouse_click = b.key + if event.type == pygame.KEYDOWN or not mouse_click is None: + if mouse_click is None: + my_key = event.key + else: + my_key = mouse_click + if my_key == pygame.K_ESCAPE: pygame.quit() sys.exit() - elif event.key == pygame.K_c: + elif my_key == pygame.K_c: display_num_whole = clear_display display_num_decimal = "" num_float = False float_precision = 1 - flash_button(buttons[str(event.key)]) - elif event.key == pygame.K_a: + flash_button(buttons[str(my_key)]) + elif my_key == pygame.K_a: display_num_whole = clear_display display_num_decimal = "" num_float = False float_precision = 1 - flash_button(buttons[str(event.key)]) - elif event.key == pygame.K_PERIOD or event.key == pygame.K_KP_PERIOD: + flash_button(buttons[str(my_key)]) + elif my_key == pygame.K_PERIOD or my_key == pygame.K_KP_PERIOD: actual_key = pygame.K_PERIOD flash_button(buttons[str(actual_key)]) num_float = True - elif event.key in valid_keys_equals and not pygame.key.get_mods() & pygame.KMOD_SHIFT: + elif my_key in valid_keys_equals and not pygame.key.get_mods() & pygame.KMOD_SHIFT: actual_key = pygame.K_EQUALS flash_button(buttons[str(actual_key)]) - elif event.key == pygame.K_BACKSPACE: - flash_button(buttons[str(event.key)]) + elif my_key == pygame.K_BACKSPACE: + flash_button(buttons[str(my_key)]) if num_float == True: if display_num_decimal == "": num_float = False @@ -203,23 +216,23 @@ while True: display_num_whole = display_num_whole[:-1] elif display_num_whole != "0": display_num_whole = "0" - elif (event.key == pygame.K_EQUALS and pygame.key.get_mods() & pygame.KMOD_SHIFT) or event.key == pygame.K_KP_PLUS: + elif (my_key == pygame.K_EQUALS and pygame.key.get_mods() & pygame.KMOD_SHIFT) or my_key == pygame.K_KP_PLUS: actual_key = pygame.K_PLUS flash_button(buttons[str(actual_key)]) - elif event.key == pygame.K_MINUS or event.key == pygame.K_KP_MINUS: + elif my_key == pygame.K_MINUS or my_key == pygame.K_KP_MINUS: actual_key = pygame.K_MINUS flash_button(buttons[str(actual_key)]) - elif (event.key == pygame.K_8 and pygame.key.get_mods() & pygame.KMOD_SHIFT) or event.key == pygame.K_KP_MULTIPLY: + elif (my_key == pygame.K_8 and pygame.key.get_mods() & pygame.KMOD_SHIFT) or my_key == pygame.K_KP_MULTIPLY: actual_key = pygame.K_ASTERISK flash_button(buttons[str(actual_key)]) - elif event.key == pygame.K_SLASH or event.key == pygame.K_KP_DIVIDE: + elif my_key == pygame.K_SLASH or my_key == pygame.K_KP_DIVIDE: actual_key = pygame.K_SLASH flash_button(buttons[str(actual_key)]) - elif event.key in valid_keys_numbers: - if str(event.key) in keypad_map.keys(): - actual_key = keypad_map[str(event.key)] + elif my_key in valid_keys_numbers: + if str(my_key) in keypad_map.keys(): + actual_key = keypad_map[str(my_key)] else: - actual_key = event.key + actual_key = my_key flash_button(buttons[str(actual_key)]) if len(display_num_whole) <= 10: if num_float == False: @@ -230,10 +243,10 @@ while True: else: display_num_decimal += chr(actual_key) if display_num_whole != old_display_num_whole or display_num_decimal != old_display_num_decimal: - print(f"Number: {display_num_whole}", end='') - if num_float == True: - print(".", end='') - print(display_num_decimal) + #print(f"Number: {display_num_whole}", end='') + #if num_float == True: + # print(".", end='') + #print(display_num_decimal) old_display_num_whole = display_num_whole old_display_num_decimal = display_num_decimal pygame.draw.rect(screen, black, pygame.Rect(10, 100, width - 20, 110))