用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中的面向对象编程的概念
Apr 27 Python
python的变量与赋值详细分析
Nov 08 Python
python中找出numpy array数组的最值及其索引方法
Apr 17 Python
让代码变得更易维护的7个Python库
Oct 09 Python
详解安装mitmproxy以及遇到的坑和简单用法
Jan 21 Python
Python 爬虫实现增加播客访问量的方法实现
Oct 31 Python
python @propert装饰器使用方法原理解析
Dec 25 Python
Pycharm中import torch报错的快速解决方法
Mar 05 Python
jupyter notebook tensorflow打印device信息实例
Apr 20 Python
Python基于pillow库实现生成图片水印
Sep 14 Python
基于python实现复制文件并重命名
Sep 16 Python
python程序实现BTC(比特币)挖矿的完整代码
Jan 20 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调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
php检查是否是ajax请求的方法
2015/04/16 PHP
PHP中的一些常用函数收集
2015/05/26 PHP
在Laravel 的 Blade 模版中实现定义变量
2019/10/14 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
项目实践之javascript技巧
2007/12/06 Javascript
javascript实现的网页局布刷新效果
2008/12/01 Javascript
jQuery chili图片远处放大插件
2009/11/30 Javascript
JS获取整个页面文档的实现代码
2011/12/15 Javascript
JavaScript根据数据生成百分比图和柱状图的实例代码
2013/07/14 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
ES6新特征数字、数组、字符串
2016/10/01 Javascript
微信小程序  网络请求API详解
2016/10/25 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
JS获取本地地址及天气的方法实例小结
2019/05/10 Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
微信小程序与公众号卡券/会员打通的问题
2019/07/25 Javascript
Python 模拟登陆的两种实现方法
2017/08/10 Python
Python使用Tkinter实现机器人走迷宫
2018/01/22 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
2018/07/26 Python
Python绘制并保存指定大小图像的方法
2019/01/10 Python
分析运行中的 Python 进程详细解析
2019/06/22 Python
Django rest framework分页接口实现原理解析
2020/08/21 Python
Python 字典一个键对应多个值的方法
2020/09/29 Python
Html5如何唤起百度地图App的方法
2019/01/27 HTML / CSS
大学生村官事迹材料
2014/01/21 职场文书
小小的船教学反思
2014/02/21 职场文书
大学生交通专业求职信
2014/09/01 职场文书
恋恋笔记本观后感
2015/06/16 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书
如何用JavaScript检测当前浏览器是无头浏览器
2021/04/27 Javascript
默认网关不可用修复后过一会又不好使了解决方法
2022/04/08 数码科技