Make a Python GUI app to test your typing speed - Python PyGame tutorial

 Idea

This article will teach you how you can test your typing speed, but in programmer style, with Python. Check how fast you can type by making your own software to calculate the basic things needed to get the idea of your typing speed. We are going to use PyGame for making this software. You can also make this with Tkinter or other GUI. But PyGame is a bit useful for making these kind of GUIs, so I used it.

 Prerequisites

Basic knowleddge of Python, knowledge of Classes and Functions in Python, how to install Python packages with pip, Knowledge about PyGame, a concept of File Handling and knowledge of its functions.

Download a suitable landscape background image you want for this app and rename that to "bg.jpg". Download a cartoon png from anywhere, or follow this link. Rename the character to "char.png".

Make a text file named typing.txt containing the collection of some sentences, e.g.,

The quick brown fox jumps over the lazy dog

Anyone who lives in Antarctica is their for a scientific research station.

Save all these files at one location on your device, inside the same directory (folder). 

 Install PyGame

  pip install pygame  

Type this command in your terminal: cmd, bash, etc.. and press enter (run).

  Code

Import modules

import pygame
from pygame.locals import *
import sys
import time
import random

Game class (contains all the functions for the game)

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('bg.jpg')
        self.open_img = pygame.transform.scale(self.open_img, (self.w,self.h))
        self.bg = pygame.image.load('bg.jpg')
        self.bg = pygame.transform.scale(self.bg, (self.w,self.h))
        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('typing.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)) +"sec," +
" Accuracy: "+ str(round(self.accuracy)) + "%, " +
'Wpm: ' + str(round(self.wpm))
            # draw icon image
            self.time_img = pygame.image.load('char.png')
            self.time_img = pygame.transform.scale(self.time_img, (150,150))
            screen.blit(self.time_img, (self.w/2-115,self.h-140))
            self.draw_text(screen,"Reset", self.h - 93, 26, (100,100,10))
            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((255,255,255))
        self.screen.blit(self.bg,(0,0))
        msg = "Typing Speed Test"
        self.draw_text(self.screen, msg, 80, 80,"red")
        # draw the rectangle for input box
        pygame.draw.rect(self.screen, (255,192,25), (50,250,650,50), 1)
        # draw the sentence string
        self.draw_text(self.screen, self.word,175, 28,"blue")
        pygame.display.update()

Run the game

Game().run()

 Output

Now your game is ready.

Make a Python GUI app to test your typing speed - Python Game - PyGame Tutorial - Pencyl - mypencyl.blogspot.com

Make a Python GUI app to test your typing speed - Python Game - PyGame Tutorial - Pencyl - mypencyl.blogspot.com

 Summary

In this article you learnt about making an app to test your typing speed in Python with PyGame. You learnt about PyGame module.

Thanks for reading. Hope you liked the idea and project. Do comment down you opinions. Also, share this project with your friends and programmers.


Comments