Signup/Sign In
PUBLISHED ON: MARCH 10, 2022

Speed Typing Test Python Project

Speed Typing Test Python Project

In this Python project idea, we'll create an amazing project that will allow you to test and improve your typing speed. We'll utilize the pygame library, which is used to interact with graphics, to create a graphical user interface. The graphics and text that will be shown on the screen will be drawn.

Prerequisites

The Python project needs a basic understanding of Python programming and the Pygame module.

In your terminal, enter the following code to install the pygame library.

 pip install pygame


How to Create a Python Typing Speed Test Project

Let's have a look at the file structure of the Python project with source code that we'll be creating:
Backdrop.jpg — This is the picture that will be used as a background in our software.

Icon.png — This is the icon that will be used as a reset button.

Sentences.txt - A list of sentences will be separated by a new line in this text file.

The main program file, speedtyping.py, includes all of the code.

Typing-speed-open.png – This is the picture that will appear when you first start the game.

To begin, we produced the sentences.txt file, which has various lines separated by a new line.

This time, we'll create the software using an object-oriented approach.

Source Code for Typing Speed Test

 import pygame from pygame.locals import * import sys import time import random # 750 x 500 class Game: def __init__(self): self.w=750 self.h=500 self.reset=True self.active = False self.input_text='' self.word = '' self.time_start = 0 self.total_time = 0 self.accuracy = '0%' self.results = 'Time:0 Accuracy:0 % Wpm:0 ' self.wpm = 0 self.end = False self.HEAD_C = (255,213,102) self.TEXT_C = (240,240,240) self.RESULT_C = (255,70,70) pygame.init() self.open_img = pygame.image.load('type-speed-open.png') self.open_img = pygame.transform.scale(self.open_img, (self.w,self.h)) self.bg = pygame.image.load('background.jpg') self.bg = pygame.transform.scale(self.bg, (500,750)) self.screen = pygame.display.set_mode((self.w,self.h)) pygame.display.set_caption('Type Speed test') def draw_text(self, screen, msg, y ,fsize, color): font = pygame.font.Font(None, fsize) text = font.render(msg, 1,color) text_rect = text.get_rect(center=(self.w/2, y)) screen.blit(text, text_rect) pygame.display.update() def get_sentence(self): f = open('sentences.txt').read() sentences = f.split('\n') sentence = random.choice(sentences) return sentence def show_results(self, screen): if(not self.end): #Calculate time self.total_time = time.time() - self.time_start #Calculate accuracy count = 0 for i,c in enumerate(self.word): try: if self.input_text[i] == c: count += 1 except: pass self.accuracy = count/len(self.word)*100 #Calculate words per minute self.wpm = len(self.input_text)*60/(5*self.total_time) self.end = True print(self.total_time) self.results = 'Time:'+str(round(self.total_time)) +" secs Accuracy:"+ str(round(self.accuracy)) + "%" + ' Wpm: ' + str(round(self.wpm)) # draw icon image self.time_img = pygame.image.load('icon.png') self.time_img = pygame.transform.scale(self.time_img, (150,150)) #screen.blit(self.time_img, (80,320)) screen.blit(self.time_img, (self.w/2-75,self.h-140)) self.draw_text(screen,"Reset", self.h - 70, 26, (100,100,100)) print(self.results) pygame.display.update() def run(self): self.reset_game() self.running=True while(self.running): clock = pygame.time.Clock() self.screen.fill((0,0,0), (50,250,650,50)) pygame.draw.rect(self.screen,self.HEAD_C, (50,250,650,50), 2) # update the text of user input self.draw_text(self.screen, self.input_text, 274, 26,(250,250,250)) pygame.display.update() for event in pygame.event.get(): if event.type == QUIT: self.running = False sys.exit() elif event.type == pygame.MOUSEBUTTONUP: x,y = pygame.mouse.get_pos() # position of input box if(x>=50 and x<=650 and y>=250 and y<=300): self.active = True self.input_text = '' self.time_start = time.time() # position of reset box if(x>=310 and x<=510 and y>=390 and self.end): self.reset_game() x,y = pygame.mouse.get_pos() elif event.type == pygame.KEYDOWN: if self.active and not self.end: if event.key == pygame.K_RETURN: print(self.input_text) self.show_results(self.screen) print(self.results) self.draw_text(self.screen, self.results,350, 28, self.RESULT_C) self.end = True elif event.key == pygame.K_BACKSPACE: self.input_text = self.input_text[:-1] else: try: self.input_text += event.unicode except: pass pygame.display.update() clock.tick(60) def reset_game(self): self.screen.blit(self.open_img, (0,0)) pygame.display.update() time.sleep(1) self.reset=False self.end = False self.input_text='' self.word = '' self.time_start = 0 self.total_time = 0 self.wpm = 0 # Get random sentence self.word = self.get_sentence() if (not self.word): self.reset_game() #drawing heading self.screen.fill((0,0,0)) self.screen.blit(self.bg,(0,0)) msg = "Typing Speed Test" self.draw_text(self.screen, msg,80, 80,self.HEAD_C) # draw the rectangle for input box pygame.draw.rect(self.screen,(255,192,25), (50,250,650,50), 2) # draw the sentence string self.draw_text(self.screen, self.word,200, 28,self.TEXT_C) pygame.display.update() Game().run()

Output

typing test

Typing Test

Summary

With the aid of the pygame package, you worked on a Python project to create your own typing speed testing game.



About the author:
Adarsh Kumar Singh is a technology writer with a passion for coding and programming. With years of experience in the technical field, he has established a reputation as a knowledgeable and insightful writer on a range of technical topics.