Typo Speed - Typing Speed Calculator
Submitted by bbmevada on Thursday, August 13, 2020 - 18:26.
Language
Hello Guys, Here I've Uploaded a Sourcecode of Typo Speed - Typing Speed Calculator Created in Python 3.
If you want full tutorial video then you can visit bb coder guy (https://www.youtube.com/channel/UC-bbvWb1huCXugbY45l_zoQ) Youtube Channel
To run this you have to install python module listed below:
ttkthemes - pip install ttkthemes
Happy Learning :)
Source Code
- import tkinter as tk
- import time
- from tkinter import ttk
- from ttkthemes import themed_tk as tt
- import threading
- import random
- # Initial Variables
- timeLimit = 60
- remainingTime = timeLimit
- elpasedTime = 0
- elpasedTimeInMinute = 0
- totalWords = 0
- wrong_words = 0
- net_wpm=0
- accuracy=0
- # ************************************************************************ Start Button *****************************************************************
- def start_timer():
- global elpasedTime
- entry.focus()
- entry.config(state='normal')
- button_start.config(state='disabled')
- button_reset.config(state='disabled')
- for k in range(1,timeLimit + 1):
- elpasedTime = k
- lbl_elpasedTimer['text'] = elpasedTime
- updatedRemainingTime = remainingTime - elpasedTime
- lbl_remainingTimer['text'] = updatedRemainingTime
- time.sleep(1)
- root.update()
- entry.config(state='disabled')
- button_reset.config(state='normal')
- def result():
- global wrong_words
- global elpasedTime
- global elpasedTimeInMinute
- global accuracy
- para_words = lbl_paragraph['text'].split()
- while elpasedTime != timeLimit:
- enteredParagraph = entry.get(1.0,'end-1c').split()
- totalWords = len(enteredParagraph)
- for pair in list(zip(para_words,enteredParagraph)):
- if pair[0] != pair[1]:
- wrong_words+=1
- elpasedTimeInMinute = elpasedTime/60
- # gross wpm
- gross_wpm = (totalWords)/elpasedTimeInMinute
- # net wpm
- net_wpm = (totalWords-wrong_words)/elpasedTimeInMinute
- lbl_wpm['text'] = round(net_wpm)
- # accuracy
- accuracy = (net_wpm/gross_wpm) * 100
- lbl_accuracy['text'] = round(accuracy,2)
- # total words
- lbl_total_words['text'] = totalWords
- # wrong words
- lbl_wrong_words['text'] = wrong_words
- def start():
- thr1 = threading.Thread(target=start_timer)
- thr1.start()
- thr2 = threading.Thread(target=result)
- thr2.start()
- # ************************************************************ Reset Button *******************************************************
- def reset():
- global remainingTime
- global elpasedTime
- button_reset.config(state='disabled')
- button_start.config(state='normal')
- entry.config(state='normal')
- entry.delete(1.0,tk.END)
- entry.config(state='disabled')
- remainingTime = timeLimit
- elpasedTime = 0
- lbl_elpasedTimer['text'] = 0
- lbl_remainingTimer['text'] = 60
- lbl_wpm['text'] = 0
- lbl_accuracy['text'] = 0
- lbl_total_words['text'] = 0
- lbl_wrong_words['text'] = 0
- # *************************************************************** Random Paragraph **************************************************
- with open('paragraph.txt') as f:
- paragraphs = f.readlines()
- selected_paragraph =random.choice(paragraphs)
- # **************************************************************************************************************************************************
- # **************************************************************************************************************************************************
- # **************************************************************************************************************************************************
- # ********************************************************************* Designing ******************************************************************
- # **************************************************************************************************************************************************
- # **************************************************************************************************************************************************
- # **************************************************************************************************************************************************
- ###################################################################### Creating Window ############################################################
- root = tt.ThemedTk()
- root.get_themes()
- root.set_theme("radiance")
- root.title("Typo Speed (Developed by : BB Coder Guy)")
- root.geometry('1140x950+400+20')
- root.configure(bg='white')
- root.resizable(False,False)
- # *******************************************************************************************************************************************
- ############################################################### Main Frame #######################################################
- center_frame_main = tk.Frame(root,bg='white',bd=4)
- ###### Title Frame ######
- frame_title = tk.Frame(center_frame_main,bg='orange',relief='flat')
- lbl_title = tk.Label(frame_title,text='Typo Speed',font='algerian 35 bold',bg='light yellow',fg='black',relief='flat',bd=10,width=30)
- lbl_title.grid(row=0,pady=10)
- frame_title.grid(row=0,columnspan=12)
- # ****** Title Frame End *****************
- ###### Test Frame ######
- frame_test = tk.LabelFrame(center_frame_main,text='Test',bd='4',bg='white')
- lbl_paragraph = tk.Label(frame_test,text=selected_paragraph,wraplength=1000,justify='left')
- entry = tk.Text(frame_test,height=8,width=110,bd=2)
- entry.config(state='disabled')
- lbl_paragraph.grid(row=0,sticky='ew',pady=5)
- entry.grid(row=1)
- frame_test.grid(row=1,columnspan=12,sticky='n',padx=5,pady=5)
- # ********* Test Frame End **************
- ###### Output Frame ######
- font = 'Tahoma 10 bold'
- title_color = 'red'
- frame_output = tk.LabelFrame(center_frame_main,bg='white',relief='flat')
- ###### Labels
- frame_labels = tk.Frame(frame_output,bg='white')
- lbl_elpasedTime = tk.Label(frame_labels,text='Elpased Time',font=font,fg=title_color,bg='white')
- lbl_elpasedTimer = tk.Label(frame_labels,text='0',font=font,bg='white')
- lbl_remainingTime = tk.Label(frame_labels,text='Remaining Time',font=font,fg=title_color,bg='white')
- lbl_remainingTimer = tk.Label(frame_labels,text='60',font=font,bg='white')
- lbl_wpm_title = tk.Label(frame_labels,text='WPM',font=font,fg=title_color,bg='white')
- lbl_wpm = tk.Label(frame_labels,text='0',font=font,bg='white')
- lbl_accuracy_title = tk.Label(frame_labels,text='Accuracy(%)',font=font,fg=title_color,bg='white')
- lbl_accuracy = tk.Label(frame_labels,text='0',font=font,bg='white')
- lbl_total_words_title = tk.Label(frame_labels,text='Total Words',font=font,fg=title_color,bg='white')
- lbl_total_words = tk.Label(frame_labels,text='0',font=font,bg='white')
- lbl_wrong_words_title = tk.Label(frame_labels,text='Wrong Words',font=font,fg=title_color,bg='white')
- lbl_wrong_words = tk.Label(frame_labels,text='0',font=font,bg='white')
- lbl_elpasedTime.grid(row=0,column=0,padx=10,pady=10)
- lbl_elpasedTimer.grid(row=0,column=1,padx=10,pady=5)
- lbl_remainingTime.grid(row=0,column=2,padx=10,pady=5)
- lbl_remainingTimer.grid(row=0,column=3,padx=10,pady=5)
- lbl_wpm_title.grid(row=0,column=4,padx=10,pady=10)
- lbl_wpm.grid(row=0,column=5,padx=10)
- lbl_accuracy_title.grid(row=0,column=6,padx=10,pady=10)
- lbl_accuracy.grid(row=0,column=7,padx=10)
- lbl_total_words_title.grid(row=0,column=8,padx=10)
- lbl_total_words.grid(row=0,column=9,padx=10)
- lbl_wrong_words_title.grid(row=0,column=10,padx=10)
- lbl_wrong_words.grid(row=0,column=11,padx=10)
- frame_labels.grid(row=0,columnspan=12,sticky='n')
- ###### Buttons
- frame_controls = tk.Frame(frame_output,bg='white')
- button_start = ttk.Button(frame_controls,text='Start',command=start)
- button_reset = ttk.Button(frame_controls,text='Reset',command=reset)
- button_reset.config(state='disabled')
- button_start.grid(row=1,column=0,padx=10,sticky='n')
- button_reset.grid(row=1,column=1,padx=10,sticky='n')
- frame_controls.grid(row=1,columnspan=12,sticky='n')
- frame_output.grid(row=2,columnspan=12,sticky='n')
- # *********************** Output Frame End ****************
- ###### Keyboard Frame ######
- frame_keyboard = tk.LabelFrame(center_frame_main,bd=4,bg='white',fg='black',relief='flat')
- # frame_1_0 = tk.Frame(frame_keyboard,bg='white')
- # for i in range(0,10):
- # exec(f"lbl_{i} = tk.Label(frame_1_0,text='{i}',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)")
- # exec(f"lbl_{i}.grid(row=0,column=i+1,padx=10,pady=5)")
- ###### 1-0
- frame_1_0 = tk.Frame(frame_keyboard,bg='white')
- lbl_1 = tk.Label(frame_1_0,text='1',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_2 = tk.Label(frame_1_0,text='2',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_3 = tk.Label(frame_1_0,text='3',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_4 = tk.Label(frame_1_0,text='4',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_5 = tk.Label(frame_1_0,text='5',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_6 = tk.Label(frame_1_0,text='6',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_7 = tk.Label(frame_1_0,text='7',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_8 = tk.Label(frame_1_0,text='8',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_9 = tk.Label(frame_1_0,text='9',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_0 = tk.Label(frame_1_0,text='0',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_1.grid(row=0,column=1,padx=10,pady=5)
- lbl_2.grid(row=0,column=2,padx=10,pady=5)
- lbl_3.grid(row=0,column=3,padx=10,pady=5)
- lbl_4.grid(row=0,column=4,padx=10,pady=5)
- lbl_5.grid(row=0,column=5,padx=10,pady=5)
- lbl_6.grid(row=0,column=6,padx=10,pady=5)
- lbl_7.grid(row=0,column=7,padx=10,pady=5)
- lbl_8.grid(row=0,column=8,padx=10,pady=5)
- lbl_9.grid(row=0,column=9,padx=10,pady=5)
- lbl_0.grid(row=0,column=10,padx=10,pady=5)
- frame_1_0.grid(row=0)
- ###### Q-P
- frame_q_p = tk.Frame(frame_keyboard,bg='white')
- lbl_Q = tk.Label(frame_q_p,text='Q',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_W = tk.Label(frame_q_p,text='W',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_E = tk.Label(frame_q_p,text='E',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_R = tk.Label(frame_q_p,text='R',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_T = tk.Label(frame_q_p,text='T',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_Y = tk.Label(frame_q_p,text='Y',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_U = tk.Label(frame_q_p,text='U',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_I = tk.Label(frame_q_p,text='I',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_O = tk.Label(frame_q_p,text='O',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_P = tk.Label(frame_q_p,text='P',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_Q.grid(row=0,column=1,padx=10,pady=5)
- lbl_W.grid(row=0,column=2,padx=10,pady=5)
- lbl_E.grid(row=0,column=3,padx=10,pady=5)
- lbl_R.grid(row=0,column=4,padx=10,pady=5)
- lbl_T.grid(row=0,column=5,padx=10,pady=5)
- lbl_Y.grid(row=0,column=6,padx=10,pady=5)
- lbl_U.grid(row=0,column=7,padx=10,pady=5)
- lbl_I.grid(row=0,column=8,padx=10,pady=5)
- lbl_O.grid(row=0,column=9,padx=10,pady=5)
- lbl_P.grid(row=0,column=10,padx=10,pady=5)
- frame_q_p.grid(row=1)
- ###### A-L
- frame_a_l = tk.Frame(frame_keyboard,bg='white')
- lbl_A = tk.Label(frame_a_l,text='A',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_S = tk.Label(frame_a_l,text='S',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_D = tk.Label(frame_a_l,text='D',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_F = tk.Label(frame_a_l,text='F',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_G = tk.Label(frame_a_l,text='G',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_H = tk.Label(frame_a_l,text='H',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_J = tk.Label(frame_a_l,text='J',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_K = tk.Label(frame_a_l,text='K',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_L = tk.Label(frame_a_l,text='L',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_A.grid(row=0,column=1,padx=10,pady=5)
- lbl_S.grid(row=0,column=2,padx=10,pady=5)
- lbl_D.grid(row=0,column=3,padx=10,pady=5)
- lbl_F.grid(row=0,column=4,padx=10,pady=5)
- lbl_G.grid(row=0,column=5,padx=10,pady=5)
- lbl_H.grid(row=0,column=6,padx=10,pady=5)
- lbl_J.grid(row=0,column=7,padx=10,pady=5)
- lbl_K.grid(row=0,column=8,padx=10,pady=5)
- lbl_L.grid(row=0,column=9,padx=10,pady=5)
- frame_a_l.grid(row=2)
- ###### Z-M
- frame_z_m = tk.Frame(frame_keyboard,bg='white')
- lbl_Z = tk.Label(frame_z_m,text='Z',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_X = tk.Label(frame_z_m,text='X',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_C = tk.Label(frame_z_m,text='C',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_V = tk.Label(frame_z_m,text='V',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_B = tk.Label(frame_z_m,text='B',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_N = tk.Label(frame_z_m,text='N',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_M = tk.Label(frame_z_m,text='M',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
- lbl_Z.grid(row=0,column=1,padx=10,pady=5)
- lbl_X.grid(row=0,column=2,padx=10,pady=5)
- lbl_C.grid(row=0,column=3,padx=10,pady=5)
- lbl_V.grid(row=0,column=4,padx=10,pady=5)
- lbl_B.grid(row=0,column=5,padx=10,pady=5)
- lbl_N.grid(row=0,column=6,padx=10,pady=5)
- lbl_M.grid(row=0,column=7,padx=10,pady=5)
- frame_z_m.grid(row=3)
- ###### space
- frame_space = tk.Frame(frame_keyboard,bg='white')
- lbl_space = tk.Label(frame_space,bg='black',width=40,height=2,relief='groove',bd=10)
- lbl_space.grid(row=0,columnspan=10,padx=10,pady=4)
- frame_space.grid(row=4)
- frame_keyboard.grid(row=3,columnspan=12,sticky='n')
- # *********** Keyboard Frame End *****************
- center_frame_main.grid()
- # ************************************************************** Main Frame End ***************************************************************
- ###### Key Bindings
- def changeBGEnter(widget):
- bg = 'black'
- widget.configure(background="blue")
- widget.after(100, lambda color=bg: widget.configure(background=color))
- labels_numbers = [lbl_1,lbl_2,lbl_3,lbl_4,lbl_5,lbl_6,lbl_7,lbl_8,lbl_9,lbl_0]
- labels_alpha = [lbl_A,lbl_B,lbl_C,lbl_D,lbl_E,lbl_F,lbl_G,lbl_H,lbl_I,lbl_J,lbl_K,lbl_L,lbl_M,lbl_N,lbl_O,lbl_P,lbl_Q,lbl_R,lbl_S,lbl_T,lbl_U,lbl_V,lbl_W,lbl_X,lbl_Y,lbl_Z]
- labels_space = [lbl_space]
- bindings_number_list = [1,2,3,4,5,6,7,8,9,0]
- bindings_capital_alphabet_list = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
- bindings_small_alphabet_list = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
- for number in range(len(bindings_number_list)):
- root.bind(f"{bindings_number_list[number]}", lambda event, label=labels_numbers[number]: changeBGEnter(label))
- for capital_alphabet in range(len(bindings_capital_alphabet_list)):
- root.bind(f"<{bindings_capital_alphabet_list[capital_alphabet]}>", lambda event, label=labels_alpha[capital_alphabet]: changeBGEnter(label))
- for small_alphabet in range(len(bindings_small_alphabet_list)):
- root.bind(f"<{bindings_small_alphabet_list[small_alphabet]}>", lambda event, label=labels_alpha[small_alphabet]: changeBGEnter(label))
- root.bind("<space>", lambda event, label=labels_space[0]: changeBGEnter(label))
- root.mainloop()
Note: Due to the size or complexity of this submission, the author has submitted it as a .zip file to shorten your download time. After downloading it, you will need a program like Winzip to decompress it.
Virus note: All files are scanned once-a-day by SourceCodester.com for viruses, but new viruses come out every day, so no prevention program can catch 100% of them.
FOR YOUR OWN SAFETY, PLEASE:
1. Re-scan downloaded files using your personal virus checker before using it.
2. NEVER, EVER run compiled files (.exe's, .ocx's, .dll's etc.)--only run source code.
Add new comment
- 783 views