Build a clock application with Pygame (Python).
- Python 3+ (Download here)
- Visual Studio Code IDE (Download here)
- Sound samples (E.g alarm.wav, tick.wav) (Download here)
Install pygame library
pip install pygame
# install pygame module
import pygame
import time
import math
pygame.init()
screen = pygame.display.set_mode((500,600))
pygame.display.set_caption("Countdown")
AQUA = (0,255,255)
GRAY = (169,169,169)
BLACK = (0,0,0)
RED = (255,0,0)
clock = pygame.time.Clock()
font = pygame.font.SysFont('sans', 50)
font1 = pygame.font.SysFont('sans', 100)
b1 = font.render('+', True, BLACK)
b2 = font.render('-', True, BLACK)
b3 = font.render('Min', True, BLACK)
b4 = font.render('Sec', True, BLACK)
b5 = font.render('Start', True, BLACK)
b6 = font.render('Reset', True, BLACK)
mins = 0
secs = 0
total = 0
start = False
total_secs = 0
running = True
sound1 = pygame.mixer.Sound("Clock Project/tick.wav")
sound2 = pygame.mixer.Sound("Clock Project/alarm.wav")
We put inside the while loop for running continuosly, includes:
- Set mouse x, y
- Fill the background into gray color
- Draw components of the app (E.g min, sec, etc.)
- Events that listen to users' actions
while running:
# Mouse
mouse_x, mouse_y = pygame.mouse.get_pos()
clock.tick(60)
# fill the background into gray color
screen.fill(GRAY)
pygame.draw.rect(screen, AQUA, (100, 50, 50, 50))
pygame.draw.rect(screen, AQUA, (100, 130, 50, 50))
pygame.draw.rect(screen, AQUA, (350, 50, 50, 50))
pygame.draw.rect(screen, AQUA, (350, 130, 50, 50))
pygame.draw.rect(screen, AQUA, (50, 200, 170, 50))
pygame.draw.rect(screen, AQUA, (280, 200, 170, 50))
pygame.draw.rect(screen, AQUA, (45, 495, 410, 60))
pygame.draw.rect(screen, AQUA, (50, 500, 400, 50))
# Draw min
screen.blit(b3, (10,45))
screen.blit(b3, (420,45))
# Draw sec
screen.blit(b4, (10, 125))
screen.blit(b4, (420, 125))
# Draw '+'
screen.blit(b1, (112,45)) # increase 12 points of X
screen.blit(b1, (112,125)) # Decrease 5 points of y
# Draw '-'
screen.blit(b2, (368,42)) # increase 18 points of x
screen.blit(b2, (368,122)) # Decrease 8 points of y
# Draw 'start'
screen.blit(b5, (92,195))
# Draw 'Reset'
screen.blit(b6, (310,195))
# Draw circle of clock
pygame.draw.circle(screen, BLACK, (250,380), 100)
pygame.draw.circle(screen, AQUA, (250,380), 95)
pygame.draw.circle(screen, BLACK, (250,380), 5)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
if (100<mouse_x<150) and (50<mouse_y<100):
total = total_secs
total_secs += 60
if (100<mouse_x<150) and (130<mouse_y<180):
total = total_secs
total_secs += 1
if (350<mouse_x<400) and (50<mouse_y<100):
total = total_secs
total_secs -= 60
if (350<mouse_x<400) and (130<mouse_y<180):
total = total_secs
total_secs -= 1
if (50<mouse_x<220) and (200<mouse_y<250):
start = True
total = total_secs
if (280<mouse_x<430) and (200<mouse_y<250):
total_secs = 0
# Function of "start"
if start:
if total_secs > 0:
total_secs -= 1
pygame.mixer.Sound.play(sound1)
time.sleep(1)
else:
start = False
pygame.mixer.Sound.play(sound2)
# mins and secs
mins = total_secs // 60
secs = total_secs - (mins * 60)
# Draw current time
text_time = font1.render(str(mins) + ':' + str(secs), True, RED)
screen.blit(text_time, (180,50))
# Draw second hand
x_sec = 250 + 90 * math.sin(6 * secs * math.pi/180)
y_sec = 380 - 90 * math.cos(6 * secs * math.pi/180)
pygame.draw.line(screen, RED, (250,380), (int(x_sec), int(y_sec)))
# Draw minute hand
x_min = 250 + 50 * math.sin(6 * mins * math.pi/180)
y_min = 380 - 50 * math.cos(6 * mins * math.pi/180)
pygame.draw.line(screen, BLACK, (250,380), (int(x_min), int(y_min)))
# Draw a red rect in order to decrease gradually by time
if total != 0:
pygame.draw.rect(screen, RED, (50, 500, int(400*(total_secs/total)), 50))
pygame.display.flip()
If the loop stopped, the app would be closed with quit() method
pygame.quit()
We have created this app for some purposes:
- Pracetice Python coding skills
- Enrich my repository
- Understand some core Python library such as Pygame
