用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列表与元组详解实例
Nov 01 Python
在Python中使用mongoengine操作MongoDB教程
Apr 24 Python
深入解析Python中的集合类型操作符
Aug 19 Python
python 安装virtualenv和virtualenvwrapper的方法
Jan 13 Python
利用Python中的pandas库对cdn日志进行分析详解
Mar 07 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
Nov 30 Python
python3 pandas 读取MySQL数据和插入的实例
Apr 20 Python
set在python里的含义和用法
Jun 24 Python
代码实例讲解python3的编码问题
Jul 08 Python
Python调用REST API接口的几种方式汇总
Oct 19 Python
django中cookiecutter的使用教程
Dec 03 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
Jan 29 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实现复制移动文件的方法
2015/07/29 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
PHP用函数嵌入网站访问量计数器
2017/10/27 PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
2021/02/26 PHP
js 页面执行时间计算代码
2009/03/04 Javascript
JS事件Event元素(兼容IE,Firefox,Chorme)
2012/11/01 Javascript
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
JavaScript 实现打印,打印预览,打印设置
2014/12/30 Javascript
jQuery制作简单柱状图实例
2015/01/28 Javascript
ES6中的数组扩展方法
2016/08/26 Javascript
jQuery实现简单的tab标签页效果
2016/09/12 Javascript
jQuery解析json格式数据示例
2018/09/01 jQuery
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
[03:07]【DOTA2亚洲邀请赛】我们,梦开始的地方
2017/03/07 DOTA
python单例模式实例分析
2015/04/08 Python
python中的闭包用法实例详解
2015/05/05 Python
分享一下如何编写高效且优雅的 Python 代码
2017/09/07 Python
python print 按逗号或空格分隔的方法
2018/05/02 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
阿迪达斯德国官方网站:adidas德国
2017/07/12 全球购物
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
最新销售员个人自荐信
2013/09/21 职场文书
模具专业毕业推荐信
2014/03/08 职场文书
小学教师自我剖析材料
2014/09/29 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
英语专业毕业论文答辩开场白
2015/05/27 职场文书
Go语言 go程释放操作(退出/销毁)
2021/04/30 Golang
浅谈redis缓存在项目中的使用
2021/05/20 Redis
CSS filter 有什么神奇用途
2021/05/25 HTML / CSS
PostgreSQL13基于流复制搭建后备服务器的方法
2022/01/18 PostgreSQL
Go语言特点及基本数据类型使用详解
2022/03/21 Golang
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏
基于redis+lua进行限流的方法
2022/07/23 Redis