用Python實(shí)現(xiàn)一個(gè)打字速度測(cè)試工具來(lái)測(cè)試你的手速
一、程序解讀
本次程序中,我們使用的python庫(kù)完全是python的內(nèi)置庫(kù),其中界面的制作是利用tkinter進(jìn)行制作。核心程序可以分為三個(gè)部分,分別為:
- 文本顯示
- 文本的輸入檢查
- 結(jié)果計(jì)算和顯示
二、文本內(nèi)容的顯示
在程序初始運(yùn)行階段和點(diǎn)擊“切換文本”按鈕后,都需要在軟件的界面中顯示文本,其程序如下圖所示。
程序中self.Reset函數(shù)的作用是將界面中的內(nèi)容全部重置,設(shè)置為初始值,當(dāng)我們?cè)诮缑嬷悬c(diǎn)擊“重置”按鈕或者是初次運(yùn)行程序時(shí)都會(huì)調(diào)用self.Reset函數(shù),其效果如下圖所示。
而對(duì)比文本的顯示,則是通過(guò)調(diào)用self.getSentence函數(shù)來(lái)實(shí)現(xiàn),程序讀取本地的sentences.txt文本后,讀取所有的文本內(nèi)容,其中每一行都是一個(gè)獨(dú)立的句子。
通過(guò)random庫(kù)中的choice函數(shù)來(lái)隨機(jī)選擇一個(gè)句子,并顯示在界面當(dāng)中,當(dāng)我們點(diǎn)擊“切換文本”按鈕后,就可以實(shí)現(xiàn)在界面中更換文本,如下圖所示:
三、文本的輸入檢查
在界面中顯示文本后,接下來(lái)就是在下方的輸入框中,抄寫(xiě)上面的文本內(nèi)容。這里的文本內(nèi)容,我們是通過(guò)tkinter庫(kù)中的StringVar對(duì)象來(lái)進(jìn)行跟蹤,程序如下圖所示:
當(dāng)我們輸入文本時(shí),通過(guò)StringVar對(duì)象的trace函數(shù)來(lái)實(shí)時(shí)跟蹤文本,并執(zhí)行self.check函數(shù),self.check函數(shù)的作用是當(dāng)開(kāi)始輸入文本時(shí),設(shè)置self.start_time為文本輸入的時(shí)間。
當(dāng)我們輸入文本的長(zhǎng)度和展示的文本長(zhǎng)度一致時(shí),程序會(huì)自動(dòng)調(diào)用self.result函數(shù),來(lái)進(jìn)行結(jié)果的計(jì)算和顯示。其效果如下圖所示。
四、結(jié)果計(jì)算和顯示
對(duì)于打字速度的計(jì)算和顯示,則是通過(guò)調(diào)用self.result函數(shù)來(lái)實(shí)現(xiàn)的,其程序如下圖所示:
程序獲取用戶輸入的文本內(nèi)容,然后通過(guò)計(jì)算用戶的輸入文本和正確的文本之間的匹配程序來(lái)計(jì)算打字的準(zhǔn)確率,通過(guò)計(jì)算用戶打字的計(jì)算時(shí)間來(lái)計(jì)算用戶的打字速度,并顯示在界面中,效果如下圖所示:
五、完整代碼
話不多說(shuō),最后直接上硬貨——源碼:(注意:需要自己建立一個(gè)sentences.txt文件放入到同文件夾下)
import time from random import choice from tkinter import Tk, Label, CENTER, LEFT, StringVar, Entry,Button,DISABLED, END,NORMAL class typeSpeed(object): def __init__(self): self.start_time = 0 self.sentence_words_num = 0 self.sentence = "" self.root = Tk() self.root.geometry("900x450+300+100") self.root.title("Python打字測(cè)速") self.root.config(bg="#FFFF00") Label(self.root, text="打字速度測(cè)試器", anchor=CENTER, font=( "times new roman", 50, "bold"), bg="#00154D", fg="#F2BC90").place(x=200, y=30) self.sentence_label = Label(self.root, text="歡迎使用打字速度測(cè)試器", wraplength=400, anchor=CENTER, font=("宋體", 15, "bold"), bg="#00154D", fg="#ffffff", width=40, justify=LEFT) self.sentence_label.place(x=200, y=150) self.text = StringVar() self.text.trace("w", lambda name, index, mode, text=self.text: self.check(text)) self.input_entry = Entry(self.root, font=("宋體", 15, "bold"), width=40, textvariable=self.text) self.input_entry.place(x=200, y=250) reset_button = Button(self.root, text="重置", font=( "宋體", 18, "bold"), width=12, bg="#808080", command=self.Reset) reset_button.place(x=120, y=320) changetext_button = Button(self.root, text="切換文本", font=( "宋體", 18, "bold"), width=12, bg="#808080", command=self.getSentence) changetext_button.place(x=360, y=320) result_button = Button(self.root, text="結(jié)果", font=( "宋體", 18, "bold"), width=12, bg="#808080", command=self.result) result_button.place(x=600, y=320) self.speed_label = Label(self.root, text="速度: 00 字每分鐘", font=( "宋體", 15, "bold"), bg="#f28500", fg="#ffffff") self.speed_label.place(x=120, y=380) self.accu_label = Label(self.root, text="準(zhǔn)確率: 00%", font=( "宋體", 15, "bold"), bg="#f28500", fg="#ffffff") self.accu_label.place(x=380, y=380) self.time_label = Label(self.root, text="時(shí)間: 0 秒", font=( "宋體", 15, "bold"), bg="#f28500", fg="#ffffff") self.time_label.place(x=620, y=380) self.getSentence() self.root.mainloop() def Reset(self): self.input_entry.config(state=NORMAL) self.input_entry.delete(0, END) self.start_time = 0 self.speed_label.config(text="速度: 00字每分鐘") self.accu_label.config(text="準(zhǔn)確率: 00%") self.time_label.config(text="時(shí)間: 0 秒") def getSentence(self): self.Reset() with open("./sentences.txt", "r", encoding="utf-8") as f: sentences = f.readlines() self.sentence = choice(sentences).rstrip() self.sentence_label.config(text=self.sentence) self.sentence_words_num = len(self.sentence) def result(self): duration = round(time.time() - self.start_time) input_text = self.text.get() wpm = round((len(input_text)/duration)*60) count = 0 for index, char in enumerate(input_text): if self.sentence[index] == char: count += 1 accu = round((count/self.sentence_words_num)*100) self.speed_label.config(text="速度: {} 字每分鐘".format(wpm)) self.accu_label.config(text="準(zhǔn)確率: {}%".format(accu)) self.time_label.config(text="時(shí)間: {} 秒".format(duration)) def check(self, text): if self.start_time == 0 and len(text.get()) == 1: self.start_time = time.time() elif len(text.get()) == self.sentence_words_num: self.input_entry.config(state=DISABLED) self.result() if __name__ == '__main__':
到此這篇關(guān)于用Python實(shí)現(xiàn)一個(gè)打字測(cè)試工具來(lái)測(cè)試你的打字速度的文章就介紹到這了,更多相關(guān)Python打字測(cè)試器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中的數(shù)據(jù)可視化matplotlib與繪圖庫(kù)模塊
這篇文章介紹了Python中的數(shù)據(jù)可視化matplotlib與繪圖庫(kù)模塊,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05解決pytorch中的kl divergence計(jì)算問(wèn)題
這篇文章主要介紹了解決pytorch中的kl divergence計(jì)算問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Python?常用模塊threading和Thread模塊之線程池
這篇文章主要介紹了Python?threading和Thread模塊之線程池,線程池如消費(fèi)者,負(fù)責(zé)接收任務(wù),并將任務(wù)分配到一個(gè)空閑的線程中去執(zhí)行。并不關(guān)心是哪一個(gè)線程執(zhí)行的這個(gè)任務(wù),具體介紹需要的小伙伴可以參考下面文章詳細(xì)內(nèi)容2022-06-06python datetime處理時(shí)間小結(jié)
這篇文章主要介紹了python datetime處理時(shí)間小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Python ldap實(shí)現(xiàn)登錄實(shí)例代碼
今天給大家分享python idap實(shí)現(xiàn)登錄的實(shí)例代碼,代碼簡(jiǎn)單易懂,需要的朋友一起看看吧2016-09-09Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)字典相關(guān)計(jì)算問(wèn)題示例
這篇文章主要介紹了Python字典相關(guān)計(jì)算問(wèn)題,結(jié)合實(shí)例形式總結(jié)分析了Python字典相關(guān)的最小值、最大值、排序等操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-02-02Caffe卷積神經(jīng)網(wǎng)絡(luò)solver及其配置詳解
這篇文章主要為大家介紹了Caffe卷積神經(jīng)網(wǎng)絡(luò)solver及其配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Python技巧匿名函數(shù)、回調(diào)函數(shù)和高階函數(shù)
本文分享的是Python技巧匿名函數(shù)、回調(diào)函數(shù)和高階函數(shù),我們?cè)赑ython中使用lambda表達(dá)式來(lái)使用匿名函數(shù),回調(diào)函數(shù)即callback,先寫(xiě)一個(gè)函數(shù),讓預(yù)先寫(xiě)好的系統(tǒng)來(lái)調(diào)用,一個(gè)函數(shù)可以作為參數(shù)傳給另外一個(gè)函數(shù),或者一個(gè)函數(shù)的返回值為另外一個(gè)函數(shù),滿足其一則為高階函數(shù)2021-12-12Python實(shí)現(xiàn)Mysql全量數(shù)據(jù)同步的腳本分享
這篇文章主要為大家詳細(xì)介紹了基于Python如何實(shí)現(xiàn)Mysql全量數(shù)據(jù)同步的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-06-06