Python Project on Typing Speed Test – Build your first game in Python

Project in Python – Typing Speed Test

Have you played a typing speed game? It’s a very useful game to track your typing speed and improve it with regular practice. Now, you will be able to build your own typing speed game in Python by just following a few steps.

About the Python Project

Typing Speed Test for project in python

In this Python project idea, we are going to build an exciting project through which you can check and even improve your typing speed. For a graphical user interface, we are going to use the pygame library which is used for working with graphics. We will draw the images and text to be displayed on the screen.

WAIT! Have you worked on the 1st Python project in 20 project series by TechVidvan – Python Game Project on Tic Tac Toe


The project in Python requires you to have basic knowledge of python programming and the pygame library.

To install the pygame library, type the following code in your terminal.

pip install pygame

Follow TechVidvan on Google & Stay updated with latest technology trends

Steps to Build the Python Project on Typing Speed Test

You can download the full source code of the project from this link:

Typing Speed Test Python Project File

Let us understand the file structure of the Python project with source code that we are going to build:

file structure of project in python

  • Background.jpg – A background image we will use in our program
  • Icon.png – An icon image that we will use as a reset button.
  • Sentences.txt – This text file will contain a list of sentences separated by a new line.
  • Speed – The main program file that contains all the code
  • Typing-speed-open.png – The image to display when starting game

First, we have created the sentences.txt file in which we have added multiple sentences separated by a new line.

This time we will be using an Object-oriented approach to build the program.

1. Import the libraries

For this project based on Python, we are using the pygame library. So we need to import the library along with some built-in modules of Python like time and random library.

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

2. Create the game class

Now we create the game class which will involve many functions responsible for starting the game, reset the game and few helper functions to perform calculations that are required for our project in Python.

Let’s go ahead and create the constructor for our class where we define all the variables we will use in our project.

class Game:

    def __init__(self):
        self.reset=True = False
        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)

        self.open_img = pygame.image.load('type-speed-open.png')
        self.open_img = pygame.transform.scale(self.open_img, (self.w,self.h))
 = pygame.image.load('background.jpg') = pygame.transform.scale(, (500,750))

        self.screen = pygame.display.set_mode((self.w,self.h))
        pygame.display.set_caption('Type Speed test')

In this constructor, we have initialized the width and height of the window, variables that are needed for calculation and then we initialized the pygame and loaded the images. The screen variable is the most important on which we will draw everything.

3. draw_text() method

The draw_text() method of Game class is a helper function that will draw the text on the screen. The argument it takes is the screen, the message we want to draw, the y coordinate of the screen to position our text, the size of the font and color of the font. We will draw everything in the center of the screen. After drawing anything on the screen, pygame requires you to update the screen.

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)

4. get_sentence() method

Remember that we have a list of sentences in our sentences.txt file? The get_sentence() method will open up the file and return a random sentence from the list. We split the whole string with a newline character.

def get_sentence(self):
    f = open('sentences.txt').read()
    sentences = f.split('\n')
    sentence = random.choice(sentences)
    return sentence

5. show_results() method

The show_results() method is where we calculate the speed of the user’s typing. The time starts when the user clicks on the input box and when the user hits return key “Enter” then we perform the difference and calculate time in seconds.

To calculate accuracy, we did a little bit of math. We counted the correct typed characters by comparing input text with the display text which the user had to type.

The formula for accuracy is:

(correct characters)x100/ (total characters in sentence)

The WPM is the words per minute. A typical word consists of around 5 characters, so we calculate the words per minute by dividing the total number of words with five and then the result is again divided that with the total time it took in minutes. Since our total time was in seconds, we had to convert it into minutes by dividing total time with 60.

At last, we have drawn the typing icon image at the bottom of the screen which we will use as a reset button. When the user clicks it, our game would reset. We will see the reset_game() method later in this article.

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):
                if self.input_text[i] == c:
                    count += 1
        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

        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))


6. run() method

This is the main method of our class that will handle all the events. We call the reset_game() method at the starting of this method which resets all the variables. Next, we run an infinite loop which will capture all the mouse and keyboard events. Then, we draw the heading and the input box on the screen.

We then use another loop that will look for the mouse and keyboard events. When the mouse button is pressed, we check the position of the mouse if it is on the input box then we start the time and set the active to True. If it is on the reset button, then we reset the game.

When the active is True and typing has not ended then we look for keyboard events. If the user presses any key then we need to update the message on our input box. The enter key will end typing and we will calculate the scores to display it. Another event of a backspace is used to trim the input text by removing the last character.

def run(self):

        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))
        for event in pygame.event.get():
            if event.type == QUIT:
                self.running = False
            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):
           = 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):
                    x,y = pygame.mouse.get_pos()

            elif event.type == pygame.KEYDOWN:
                if and not self.end:
                    if event.key == pygame.K_RETURN:
                        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]
                            self.input_text += event.unicode



7. reset_game() method

The reset_game() method resets all variables so that we can start testing our typing speed again. We also select a random sentence by calling the get_sentence() method. In the end, we have closed the class definition and created the object of Game class to run the program.

    def reset_game(self):
        self.screen.blit(self.open_img, (0,0))


        self.end = False

        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
        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)




typing speed test start - project in python

typing speed test end - project in python


In this article, you worked on the Python project to build your own game of typing speed testing with the help of pygame library.

I hope you got to learn new things and enjoyed building this interesting Python project. Do share the article on social media with your friends and colleagues.

Did you know we work 24x7 to provide you best tutorials
Please encourage us - write a review on Google | Facebook

44 Responses

  1. Dom says:

    How to launch and test this project in python editor or pycharm ?

  2. programming soup says:

    great information,thnx for sharing it
    check Secrect Messaging in Python

  3. BharathiPravallika says:

    Can anyone please share use case diagram for this course!

  4. Varsha says:

    This project is not running properly. First time run gives correct output but after reseting it, it doesn’t show any value in wpm and time value is displayed like 1545925769 seconds while in reality, the time taken is very less. Also, while closing the game window, a prompt showinhg:”python not responding” is popped. Kindly help.

    • RAMYA says:

      U can change the code if ur window is not close..
      In this function
      def run(self) :
      for event in pygame. event. get() :
      if event.type == QUIT:
      self. running = False

    • CRAFTINGTABLE123 says:

      So i messed around with the project a bit and figured out that if you dont click on the middle box after resetting the game it will mess up the calculations.To fix this issue in the reset_game() method set and now after every reset you will be forced to click on the box to start typing hence avoiding any errors. Enjoy and also try to understand the code rather than copying it.

  5. RAMYA says:

    U can change the code if ur window is not close..
    In this function
    def run(self) :
    for event in pygame. event. get() :
    if event.type == QUIT:
    self. running = False

  6. Muskan says:

    In step2. Create the game class (line 27)
    change arguments(first width will come the height) = pygame.transform.scale(, (500,750))
    to = pygame.transform.scale(, (750,500))

  7. NILESH NISHAD says:

    nice very helpful

  8. vaibhav says:

    the code is not working on pycharm

  9. Bibhudendu Palai says:

    I got the error no module name pygame , i have already install it in cmd can you please help me

  10. Subhia Gupta says:

    I got the error no module name pygame

  11. Dinesh Kumar says:

    Can i use this code in github

  12. Jain Vinit says:

    ‘Game’ object has no attribute ‘run’ error shown

    • Katie says:

      Make sure it’s indented correctly. Only the first function (def __init__(self)) should be in the class game, then all the other functions should not be part of it. This fixed it for me. Also make sure that the Game().run() is outside of the functions.

  13. vinit says:

    ‘Game’ object has no attribute ‘run’ this error is shown

  14. Omkar Adhiya says:

    I am getting the return code as:

    AttributeError: ‘Game’ object has no attribute ‘run’

  15. Daniel says:

    line 27, in __init__
    self.open_img = pygame.image.load(‘type-speed-open.png’)
    FileNotFoundError: No such file or directory.

    I get this Error although I have the file and the code is the same as yours.
    Can someone explain, please?

  16. Fabiana says:

    When i finish to type the words, the results dont appear in the screen.

  17. Ayan says:

    When i run it, it doesn’t show the background, nor the text, i have followed each bit of this code very carefully, but i don’t know why it won’t work. I am using Visual Studio code.

  18. Ayan says:

    I have done all the code, and i am still not receiving anything, please help.

  19. TunaSeyd says:

    for i,c in enumerate(self.word):
    if self.input_text[i] == c:
    count += 1
    Can you explain what does i,c stand for? like how they work?

  20. Abyad says:

    I have done all the code, carefully but it’s still not working it doesn’t show anything. I am using VSCode.

  21. NAVEEN RAJ says:

    what type of algorithm is used?
    please tell anyone

  22. MSoniSama says:

    How do i make it run for 60 seconds when the user STARTS typing and end automatically when 60 seconds hit and give result??

  23. Spatar Narcis says:

    i get this problem:Unindent amount does not match previous indent

  24. Jona says:

    Getting AttributeError: ‘Event’ object has no attribute ‘key’

  25. p.puja says:

    can any one send me full code of this project i am btech 1st year i am trying to learn due to some thing i messed up my code can any one please send the full code , please do support me i need full code please

  26. Kerri says:

    Could you provide the specific version of Python this will work with? We have tried 5 different ones but it must not be the same as you were using. Thank you!

  27. Yoru2647 says:

    so when i run i get error:
    Traceback (most recent call last):
    File “f:\codes-files\python typing test\speed typing”, line 155, in
    File “f:\codes-files\python typing test\speed typing”, line 84, in run
    AttributeError: ‘Game’ object has no attribute ‘running’

    btw running from my usb stick!

  28. Someone says:

    thanks this helped

Leave a Reply

Your email address will not be published. Required fields are marked *