Typo Speed - Typing Speed Calculator

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

Source Code

  1. import tkinter as tk
  2.  
  3. import time
  4.  
  5. from tkinter import ttk
  6.  
  7. from ttkthemes import themed_tk as tt
  8.  
  9. import threading
  10.  
  11. import random
  12.  
  13.  
  14. # Initial Variables
  15.  
  16. timeLimit = 60
  17.  
  18. remainingTime = timeLimit
  19.  
  20. elpasedTime = 0
  21.  
  22. elpasedTimeInMinute = 0
  23.  
  24. totalWords = 0
  25.  
  26. wrong_words = 0
  27.  
  28. net_wpm=0
  29.  
  30. accuracy=0
  31.  
  32.  
  33. # ************************************************************************ Start Button *****************************************************************
  34.  
  35. def start_timer():
  36.  
  37.     global elpasedTime
  38.  
  39.     entry.focus()
  40.  
  41.     entry.config(state='normal')
  42.  
  43.     button_start.config(state='disabled')
  44.  
  45.     button_reset.config(state='disabled')
  46.  
  47.     for k in range(1,timeLimit + 1):
  48.  
  49.         elpasedTime = k
  50.  
  51.         lbl_elpasedTimer['text'] = elpasedTime
  52.  
  53.        
  54.  
  55.         updatedRemainingTime = remainingTime - elpasedTime
  56.  
  57.         lbl_remainingTimer['text'] = updatedRemainingTime
  58.  
  59.        
  60.  
  61.         time.sleep(1)
  62.  
  63.         root.update()
  64.  
  65.     entry.config(state='disabled')
  66.  
  67.     button_reset.config(state='normal')
  68.  
  69.    
  70.  
  71. def result():
  72.  
  73.     global wrong_words
  74.  
  75.     global elpasedTime
  76.  
  77.     global elpasedTimeInMinute
  78.  
  79.     global accuracy
  80.  
  81.     para_words = lbl_paragraph['text'].split()
  82.  
  83.     while elpasedTime != timeLimit:
  84.  
  85.         enteredParagraph = entry.get(1.0,'end-1c').split()
  86.  
  87.         totalWords = len(enteredParagraph)
  88.  
  89.     for pair in list(zip(para_words,enteredParagraph)):
  90.  
  91.         if pair[0] != pair[1]:
  92.  
  93.             wrong_words+=1
  94.  
  95.     elpasedTimeInMinute = elpasedTime/60
  96.  
  97.     # gross wpm
  98.  
  99.     gross_wpm = (totalWords)/elpasedTimeInMinute
  100.  
  101.     # net wpm
  102.  
  103.     net_wpm = (totalWords-wrong_words)/elpasedTimeInMinute
  104.  
  105.     lbl_wpm['text'] = round(net_wpm)
  106.  
  107.     # accuracy
  108.  
  109.     accuracy = (net_wpm/gross_wpm) * 100
  110.  
  111.     lbl_accuracy['text'] = round(accuracy,2)
  112.  
  113.     # total words
  114.  
  115.     lbl_total_words['text'] = totalWords
  116.  
  117.     # wrong words
  118.  
  119.     lbl_wrong_words['text'] = wrong_words
  120.  
  121. def start():
  122.  
  123.     thr1 = threading.Thread(target=start_timer)
  124.  
  125.     thr1.start()
  126.  
  127.     thr2 = threading.Thread(target=result)
  128.  
  129.     thr2.start()
  130.  
  131. # ************************************************************ Reset Button *******************************************************
  132.  
  133. def reset():
  134.  
  135.     global remainingTime
  136.  
  137.     global elpasedTime
  138.  
  139.     button_reset.config(state='disabled')
  140.  
  141.     button_start.config(state='normal')
  142.  
  143.    
  144.  
  145.     entry.config(state='normal')
  146.  
  147.     entry.delete(1.0,tk.END)
  148.  
  149.     entry.config(state='disabled')
  150.  
  151.     remainingTime = timeLimit
  152.  
  153.     elpasedTime = 0
  154.  
  155.     lbl_elpasedTimer['text'] = 0
  156.  
  157.     lbl_remainingTimer['text'] = 60
  158.  
  159.     lbl_wpm['text'] = 0
  160.  
  161.     lbl_accuracy['text'] = 0
  162.  
  163.     lbl_total_words['text'] = 0
  164.  
  165.     lbl_wrong_words['text'] = 0
  166.  
  167. # *************************************************************** Random Paragraph **************************************************
  168.  
  169. with open('paragraph.txt') as f:
  170.  
  171.     paragraphs = f.readlines()
  172.  
  173.     selected_paragraph =random.choice(paragraphs)
  174.  
  175. # **************************************************************************************************************************************************
  176.  
  177. # **************************************************************************************************************************************************
  178.  
  179. # **************************************************************************************************************************************************
  180.  
  181. # ********************************************************************* Designing ******************************************************************
  182.  
  183. # **************************************************************************************************************************************************
  184.  
  185. # **************************************************************************************************************************************************
  186.  
  187. # **************************************************************************************************************************************************
  188.  
  189. ###################################################################### Creating Window ############################################################
  190.  
  191. root = tt.ThemedTk()
  192.  
  193. root.get_themes()
  194.  
  195. root.set_theme("radiance")
  196.  
  197. root.title("Typo Speed (Developed by : BB Coder Guy)")
  198.  
  199. root.geometry('1140x950+400+20')
  200.  
  201. root.configure(bg='white')
  202.  
  203. root.resizable(False,False)
  204.  
  205. # *******************************************************************************************************************************************
  206.  
  207. ############################################################### Main Frame #######################################################
  208.  
  209. center_frame_main = tk.Frame(root,bg='white',bd=4)
  210.  
  211. ###### Title Frame ######    
  212.  
  213. frame_title = tk.Frame(center_frame_main,bg='orange',relief='flat')
  214.  
  215. lbl_title = tk.Label(frame_title,text='Typo Speed',font='algerian 35 bold',bg='light yellow',fg='black',relief='flat',bd=10,width=30)
  216.  
  217. lbl_title.grid(row=0,pady=10)
  218.  
  219. frame_title.grid(row=0,columnspan=12)
  220.  
  221. # ****** Title Frame End *****************
  222.  
  223. ###### Test Frame ######
  224.  
  225. frame_test = tk.LabelFrame(center_frame_main,text='Test',bd='4',bg='white')
  226.  
  227. lbl_paragraph = tk.Label(frame_test,text=selected_paragraph,wraplength=1000,justify='left')
  228.  
  229. entry = tk.Text(frame_test,height=8,width=110,bd=2)
  230.  
  231. entry.config(state='disabled')
  232.  
  233. lbl_paragraph.grid(row=0,sticky='ew',pady=5)
  234.  
  235. entry.grid(row=1)
  236.  
  237. frame_test.grid(row=1,columnspan=12,sticky='n',padx=5,pady=5)
  238.  
  239. # ********* Test Frame End **************
  240.  
  241. ###### Output Frame ######
  242.  
  243. font = 'Tahoma 10 bold'
  244.  
  245. title_color = 'red'
  246.  
  247. frame_output = tk.LabelFrame(center_frame_main,bg='white',relief='flat')
  248.  
  249. ###### Labels
  250.  
  251. frame_labels = tk.Frame(frame_output,bg='white')
  252.  
  253. lbl_elpasedTime = tk.Label(frame_labels,text='Elpased Time',font=font,fg=title_color,bg='white')
  254.  
  255. lbl_elpasedTimer = tk.Label(frame_labels,text='0',font=font,bg='white')
  256.  
  257. lbl_remainingTime = tk.Label(frame_labels,text='Remaining Time',font=font,fg=title_color,bg='white')
  258.  
  259. lbl_remainingTimer = tk.Label(frame_labels,text='60',font=font,bg='white')
  260.  
  261. lbl_wpm_title = tk.Label(frame_labels,text='WPM',font=font,fg=title_color,bg='white')
  262.  
  263. lbl_wpm = tk.Label(frame_labels,text='0',font=font,bg='white')
  264.  
  265. lbl_accuracy_title = tk.Label(frame_labels,text='Accuracy(%)',font=font,fg=title_color,bg='white')
  266.  
  267. lbl_accuracy = tk.Label(frame_labels,text='0',font=font,bg='white')
  268.  
  269. lbl_total_words_title = tk.Label(frame_labels,text='Total Words',font=font,fg=title_color,bg='white')
  270.  
  271. lbl_total_words = tk.Label(frame_labels,text='0',font=font,bg='white')
  272.  
  273. lbl_wrong_words_title = tk.Label(frame_labels,text='Wrong Words',font=font,fg=title_color,bg='white')
  274.  
  275. lbl_wrong_words = tk.Label(frame_labels,text='0',font=font,bg='white')
  276.  
  277. lbl_elpasedTime.grid(row=0,column=0,padx=10,pady=10)
  278.  
  279. lbl_elpasedTimer.grid(row=0,column=1,padx=10,pady=5)
  280.  
  281. lbl_remainingTime.grid(row=0,column=2,padx=10,pady=5)
  282.  
  283. lbl_remainingTimer.grid(row=0,column=3,padx=10,pady=5)
  284.  
  285. lbl_wpm_title.grid(row=0,column=4,padx=10,pady=10)
  286.  
  287. lbl_wpm.grid(row=0,column=5,padx=10)
  288.  
  289. lbl_accuracy_title.grid(row=0,column=6,padx=10,pady=10)
  290.  
  291. lbl_accuracy.grid(row=0,column=7,padx=10)
  292.  
  293. lbl_total_words_title.grid(row=0,column=8,padx=10)
  294.  
  295. lbl_total_words.grid(row=0,column=9,padx=10)
  296.  
  297. lbl_wrong_words_title.grid(row=0,column=10,padx=10)
  298.  
  299. lbl_wrong_words.grid(row=0,column=11,padx=10)
  300.  
  301. frame_labels.grid(row=0,columnspan=12,sticky='n')
  302.  
  303. ###### Buttons
  304.  
  305. frame_controls = tk.Frame(frame_output,bg='white')
  306.  
  307. button_start = ttk.Button(frame_controls,text='Start',command=start)
  308.  
  309. button_reset = ttk.Button(frame_controls,text='Reset',command=reset)
  310.  
  311. button_reset.config(state='disabled')
  312.  
  313. button_start.grid(row=1,column=0,padx=10,sticky='n')
  314.  
  315. button_reset.grid(row=1,column=1,padx=10,sticky='n')
  316.  
  317. frame_controls.grid(row=1,columnspan=12,sticky='n')
  318.  
  319. frame_output.grid(row=2,columnspan=12,sticky='n')
  320.  
  321. # *********************** Output Frame End ****************
  322.  
  323. ###### Keyboard Frame ######
  324.  
  325. frame_keyboard = tk.LabelFrame(center_frame_main,bd=4,bg='white',fg='black',relief='flat')
  326.  
  327. # frame_1_0 = tk.Frame(frame_keyboard,bg='white')
  328.  
  329. # for i in range(0,10):
  330.  
  331. #     exec(f"lbl_{i} = tk.Label(frame_1_0,text='{i}',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)")
  332.  
  333. #     exec(f"lbl_{i}.grid(row=0,column=i+1,padx=10,pady=5)")
  334.  
  335. ###### 1-0
  336.  
  337. frame_1_0 = tk.Frame(frame_keyboard,bg='white')
  338.  
  339. lbl_1 = tk.Label(frame_1_0,text='1',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  340.  
  341. lbl_2 = tk.Label(frame_1_0,text='2',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  342.  
  343. lbl_3 = tk.Label(frame_1_0,text='3',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  344.  
  345. lbl_4 = tk.Label(frame_1_0,text='4',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  346.  
  347. lbl_5 = tk.Label(frame_1_0,text='5',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  348.  
  349. lbl_6 = tk.Label(frame_1_0,text='6',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  350.  
  351. lbl_7 = tk.Label(frame_1_0,text='7',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  352.  
  353. lbl_8 = tk.Label(frame_1_0,text='8',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  354.  
  355. lbl_9 = tk.Label(frame_1_0,text='9',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  356.  
  357. lbl_0 = tk.Label(frame_1_0,text='0',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  358.  
  359. lbl_1.grid(row=0,column=1,padx=10,pady=5)
  360.  
  361. lbl_2.grid(row=0,column=2,padx=10,pady=5)
  362.  
  363. lbl_3.grid(row=0,column=3,padx=10,pady=5)
  364.  
  365. lbl_4.grid(row=0,column=4,padx=10,pady=5)
  366.  
  367. lbl_5.grid(row=0,column=5,padx=10,pady=5)
  368.  
  369. lbl_6.grid(row=0,column=6,padx=10,pady=5)
  370.  
  371. lbl_7.grid(row=0,column=7,padx=10,pady=5)
  372.  
  373. lbl_8.grid(row=0,column=8,padx=10,pady=5)
  374.  
  375. lbl_9.grid(row=0,column=9,padx=10,pady=5)
  376.  
  377. lbl_0.grid(row=0,column=10,padx=10,pady=5)
  378.  
  379. frame_1_0.grid(row=0)
  380.  
  381. ###### Q-P
  382.  
  383. frame_q_p = tk.Frame(frame_keyboard,bg='white')
  384.  
  385. lbl_Q = tk.Label(frame_q_p,text='Q',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  386.  
  387. lbl_W = tk.Label(frame_q_p,text='W',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  388.  
  389. lbl_E = tk.Label(frame_q_p,text='E',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  390.  
  391. lbl_R = tk.Label(frame_q_p,text='R',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  392.  
  393. lbl_T = tk.Label(frame_q_p,text='T',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  394.  
  395. lbl_Y = tk.Label(frame_q_p,text='Y',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  396.  
  397. lbl_U = tk.Label(frame_q_p,text='U',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  398.  
  399. lbl_I = tk.Label(frame_q_p,text='I',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  400.  
  401. lbl_O = tk.Label(frame_q_p,text='O',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  402.  
  403. lbl_P = tk.Label(frame_q_p,text='P',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  404.  
  405. lbl_Q.grid(row=0,column=1,padx=10,pady=5)
  406.  
  407. lbl_W.grid(row=0,column=2,padx=10,pady=5)
  408.  
  409. lbl_E.grid(row=0,column=3,padx=10,pady=5)
  410.  
  411. lbl_R.grid(row=0,column=4,padx=10,pady=5)
  412.  
  413. lbl_T.grid(row=0,column=5,padx=10,pady=5)
  414.  
  415. lbl_Y.grid(row=0,column=6,padx=10,pady=5)
  416.  
  417. lbl_U.grid(row=0,column=7,padx=10,pady=5)
  418.  
  419. lbl_I.grid(row=0,column=8,padx=10,pady=5)
  420.  
  421. lbl_O.grid(row=0,column=9,padx=10,pady=5)
  422.  
  423. lbl_P.grid(row=0,column=10,padx=10,pady=5)
  424.  
  425. frame_q_p.grid(row=1)
  426.  
  427. ###### A-L
  428.  
  429. frame_a_l = tk.Frame(frame_keyboard,bg='white')
  430.  
  431. lbl_A = tk.Label(frame_a_l,text='A',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  432.  
  433. lbl_S = tk.Label(frame_a_l,text='S',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  434.  
  435. lbl_D = tk.Label(frame_a_l,text='D',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  436.  
  437. lbl_F = tk.Label(frame_a_l,text='F',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  438.  
  439. lbl_G = tk.Label(frame_a_l,text='G',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  440.  
  441. lbl_H = tk.Label(frame_a_l,text='H',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  442.  
  443. lbl_J = tk.Label(frame_a_l,text='J',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  444.  
  445. lbl_K = tk.Label(frame_a_l,text='K',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  446.  
  447. lbl_L = tk.Label(frame_a_l,text='L',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  448.  
  449. lbl_A.grid(row=0,column=1,padx=10,pady=5)
  450.  
  451. lbl_S.grid(row=0,column=2,padx=10,pady=5)
  452.  
  453. lbl_D.grid(row=0,column=3,padx=10,pady=5)
  454.  
  455. lbl_F.grid(row=0,column=4,padx=10,pady=5)
  456.  
  457. lbl_G.grid(row=0,column=5,padx=10,pady=5)
  458.  
  459. lbl_H.grid(row=0,column=6,padx=10,pady=5)
  460.  
  461. lbl_J.grid(row=0,column=7,padx=10,pady=5)
  462.  
  463. lbl_K.grid(row=0,column=8,padx=10,pady=5)
  464.  
  465. lbl_L.grid(row=0,column=9,padx=10,pady=5)
  466.  
  467. frame_a_l.grid(row=2)
  468.  
  469. ###### Z-M
  470.  
  471. frame_z_m = tk.Frame(frame_keyboard,bg='white')
  472.  
  473. lbl_Z = tk.Label(frame_z_m,text='Z',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  474.  
  475. lbl_X = tk.Label(frame_z_m,text='X',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  476.  
  477. lbl_C = tk.Label(frame_z_m,text='C',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  478.  
  479. lbl_V = tk.Label(frame_z_m,text='V',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  480.  
  481. lbl_B = tk.Label(frame_z_m,text='B',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  482.  
  483. lbl_N = tk.Label(frame_z_m,text='N',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  484.  
  485. lbl_M = tk.Label(frame_z_m,text='M',bg='black',fg='white',width=5,height=2,relief='groove',bd=10)
  486.  
  487. lbl_Z.grid(row=0,column=1,padx=10,pady=5)
  488.  
  489. lbl_X.grid(row=0,column=2,padx=10,pady=5)
  490.  
  491. lbl_C.grid(row=0,column=3,padx=10,pady=5)
  492.  
  493. lbl_V.grid(row=0,column=4,padx=10,pady=5)
  494.  
  495. lbl_B.grid(row=0,column=5,padx=10,pady=5)
  496.  
  497. lbl_N.grid(row=0,column=6,padx=10,pady=5)
  498.  
  499. lbl_M.grid(row=0,column=7,padx=10,pady=5)
  500.  
  501. frame_z_m.grid(row=3)
  502.  
  503. ###### space
  504.  
  505. frame_space = tk.Frame(frame_keyboard,bg='white')
  506.  
  507. lbl_space = tk.Label(frame_space,bg='black',width=40,height=2,relief='groove',bd=10)
  508.  
  509. lbl_space.grid(row=0,columnspan=10,padx=10,pady=4)
  510.  
  511. frame_space.grid(row=4)
  512.  
  513. frame_keyboard.grid(row=3,columnspan=12,sticky='n')
  514.  
  515. # *********** Keyboard Frame End *****************
  516.  
  517. center_frame_main.grid()
  518.  
  519. # ************************************************************** Main Frame End ***************************************************************
  520.  
  521. ###### Key Bindings
  522.  
  523. def changeBGEnter(widget):
  524.  
  525.     bg = 'black'
  526.  
  527.     widget.configure(background="blue")
  528.  
  529.     widget.after(100, lambda color=bg: widget.configure(background=color))
  530.  
  531. labels_numbers = [lbl_1,lbl_2,lbl_3,lbl_4,lbl_5,lbl_6,lbl_7,lbl_8,lbl_9,lbl_0]
  532.  
  533. 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]
  534.  
  535. labels_space = [lbl_space]
  536.  
  537. bindings_number_list = [1,2,3,4,5,6,7,8,9,0]
  538.  
  539. 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']
  540.  
  541. 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']
  542.  
  543. for number in range(len(bindings_number_list)):
  544.  
  545.     root.bind(f"{bindings_number_list[number]}", lambda event, label=labels_numbers[number]: changeBGEnter(label))
  546.  
  547. for capital_alphabet in range(len(bindings_capital_alphabet_list)):
  548.  
  549.     root.bind(f"<{bindings_capital_alphabet_list[capital_alphabet]}>", lambda event, label=labels_alpha[capital_alphabet]: changeBGEnter(label))
  550.  
  551. for small_alphabet in range(len(bindings_small_alphabet_list)):
  552.  
  553.     root.bind(f"<{bindings_small_alphabet_list[small_alphabet]}>", lambda event, label=labels_alpha[small_alphabet]: changeBGEnter(label))
  554.  
  555. root.bind("<space>", lambda event, label=labels_space[0]: changeBGEnter(label))
  556.  
  557. root.mainloop()
Happy Learning :)

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