用Python实现一个打字速度测试工具来测试你的手速


Posted in Python onMay 28, 2021

一、程序解读

本次程序中,我们使用的python库完全是python的内置库,其中界面的制作是利用tkinter进行制作。核心程序可以分为三个部分,分别为:

  • 文本显示
  • 文本的输入检查
  • 结果计算和显示

二、文本内容的显示

在程序初始运行阶段和点击“切换文本”按钮后,都需要在软件的界面中显示文本,其程序如下图所示。

用Python实现一个打字速度测试工具来测试你的手速

程序中self.Reset函数的作用是将界面中的内容全部重置,设置为初始值,当我们在界面中点击“重置”按钮或者是初次运行程序时都会调用self.Reset函数,其效果如下图所示。

用Python实现一个打字速度测试工具来测试你的手速

而对比文本的显示,则是通过调用self.getSentence函数来实现,程序读取本地的sentences.txt文本后,读取所有的文本内容,其中每一行都是一个独立的句子。

通过random库中的choice函数来随机选择一个句子,并显示在界面当中,当我们点击“切换文本”按钮后,就可以实现在界面中更换文本,如下图所示:

用Python实现一个打字速度测试工具来测试你的手速

三、文本的输入检查

在界面中显示文本后,接下来就是在下方的输入框中,抄写上面的文本内容。这里的文本内容,我们是通过tkinter库中的StringVar对象来进行跟踪,程序如下图所示:

用Python实现一个打字速度测试工具来测试你的手速

用Python实现一个打字速度测试工具来测试你的手速

当我们输入文本时,通过StringVar对象的trace函数来实时跟踪文本,并执行self.check函数,self.check函数的作用是当开始输入文本时,设置self.start_time为文本输入的时间。

当我们输入文本的长度和展示的文本长度一致时,程序会自动调用self.result函数,来进行结果的计算和显示。其效果如下图所示。

用Python实现一个打字速度测试工具来测试你的手速

四、结果计算和显示

对于打字速度的计算和显示,则是通过调用self.result函数来实现的,其程序如下图所示:

用Python实现一个打字速度测试工具来测试你的手速

程序获取用户输入的文本内容,然后通过计算用户的输入文本和正确的文本之间的匹配程序来计算打字的准确率,通过计算用户打字的计算时间来计算用户的打字速度,并显示在界面中,效果如下图所示:

用Python实现一个打字速度测试工具来测试你的手速

五、完整代码

话不多说,最后直接上硬货——源码:(注意:需要自己建立一个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打字测速")
        self.root.config(bg="#FFFF00")
 
        Label(self.root, text="打字速度测试器", anchor=CENTER, font=(
            "times new roman", 50, "bold"), bg="#00154D", fg="#F2BC90").place(x=200, y=30)
 
        self.sentence_label = Label(self.root, text="欢迎使用打字速度测试器",
                                       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="结果", 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="准确率: 00%", font=(
            "宋体", 15, "bold"), bg="#f28500", fg="#ffffff")
        self.accu_label.place(x=380, y=380)
        self.time_label = Label(self.root, text="时间: 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="准确率: 00%")
        self.time_label.config(text="时间: 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="准确率: {}%".format(accu))
        self.time_label.config(text="时间: {} 秒".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__':

到此这篇关于用Python实现一个打字测试工具来测试你的打字速度的文章就介绍到这了,更多相关Python打字测试器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python进程类subprocess的一些操作方法例子
Nov 22 Python
《Python学习手册》学习总结
Jan 17 Python
在VS Code上搭建Python开发环境的方法
Apr 06 Python
python spyder中读取txt为图片的方法
Apr 27 Python
Python中的Numpy矩阵操作
Aug 12 Python
Python 实现中值滤波、均值滤波的方法
Jan 09 Python
Python中最大递归深度值的探讨
Mar 05 Python
Python imageio读取视频并进行编解码详解
Dec 10 Python
Python semaphore evevt生产者消费者模型原理解析
Mar 18 Python
手把手教你安装Windows版本的Tensorflow
Mar 26 Python
Python HTMLTestRunner如何下载生成报告
Sep 04 Python
python3 使用ssh隧道连接mysql的操作
Dec 05 Python
解决Pytorch dataloader时报错每个tensor维度不一样的问题
May 28 #Python
pytorch锁死在dataloader(训练时卡死)
Python趣味爬虫之用Python实现智慧校园一键评教
Pytorch 如何加速Dataloader提升数据读取速度
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
pytorch DataLoader的num_workers参数与设置大小详解
May 28 #Python
Flask搭建一个API服务器的步骤
May 28 #Python
You might like
制作安全性高的PHP网站的几个实用要点
2014/12/30 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
2015/06/10 PHP
PHP+JS实现的商品秒杀倒计时用法示例
2016/11/15 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
2016/12/24 PHP
php实现文件上传基本验证
2020/03/04 PHP
用php实现分页效果的示例代码
2020/12/10 PHP
javascript学习网址备忘
2007/05/29 Javascript
Textbox控件注册回车事件及触发按钮提交事件具体实现
2013/03/04 Javascript
瀑布流布局并自动加载实现代码
2013/03/12 Javascript
使用Math.floor与Math.random取随机整数的方法详解
2013/05/07 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
jQuery增加自定义函数的方法
2015/07/18 Javascript
canvas绘图不清晰的解决方案
2017/02/28 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
[40:19]2018完美盛典CS.GO表演赛
2018/12/17 DOTA
python定时关机小脚本
2018/06/20 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
python 使用递归回溯完美解决八皇后的问题
2020/02/26 Python
什么是python类属性
2020/06/10 Python
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
捷克钓鱼用品网上商店:Parys.cz
2018/06/15 全球购物
SmartBuyGlasses德国:购买太阳镜和眼镜
2019/08/20 全球购物
趣味体育活动方案
2014/02/08 职场文书
庆元旦广播稿
2014/02/10 职场文书
2014年入党积极分子党课学习心得体会模板
2014/04/03 职场文书
毕业生求职信
2014/06/10 职场文书
我爱幼儿园演讲稿
2014/09/11 职场文书
乡镇民主生活会发言材料
2014/10/20 职场文书
小学生优秀作文范文(六篇)
2019/07/10 职场文书
Mysql中where与on的区别及何时使用详析
2021/08/04 MySQL