用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迭代dict的key和value的方法
Jul 06 Python
Python爬虫框架Scrapy基本用法入门教程
Jul 26 Python
Python docx库用法示例分析
Feb 16 Python
使用Python中的reduce()函数求积的实例
Jun 28 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
Apr 07 Python
python实现音乐播放和下载小程序功能
Apr 26 Python
Django 用户登陆访问限制实例 @login_required
May 13 Python
实现ECharts双Y轴左右刻度线一致的例子
May 16 Python
Opencv求取连通区域重心实例
Jun 04 Python
Python 如何查找特定类型文件
Aug 17 Python
Python 文本滚动播放器的实现代码
Apr 25 Python
Python OpenCV实现传统图片格式与base64转换
Jun 13 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
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
PHP分页效率终结版(推荐)
2013/07/01 PHP
PHP判断变量是否为0的方法
2014/02/08 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
2016/07/09 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
AutoSave/自动存储功能实现
2007/03/24 Javascript
基于jquery的图片懒加载js
2010/06/30 Javascript
yepnope.js 异步加载资源文件
2011/09/08 Javascript
Javascript中的isNaN函数使用说明
2011/11/10 Javascript
javascript:void(0)使用探讨
2013/08/27 Javascript
Jquery uploadify图片上传插件无法上传的解决方法
2013/12/16 Javascript
jQuery操作cookie方法实例教程
2014/11/25 Javascript
jQuery+slidereveal实现的面板滑动侧边展出效果
2015/03/14 Javascript
JS基于FileSystemObject创建一个指定路径的TXT文本文件
2015/08/05 Javascript
jquery.mousewheel实现整屏翻屏效果
2015/08/30 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
2016/05/05 Javascript
最实用的jQuery分页插件
2016/10/09 Javascript
js实现拖拽功能
2017/03/01 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
详解JavaScript按概率随机生成事件
2017/08/02 Javascript
详解如何在angular2中获取节点
2017/11/23 Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
2018/05/28 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
typescript配置alias的详细步骤
2020/08/12 Javascript
Django3中的自定义用户模型实例详解
2020/08/23 Python
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
行政部工作岗位职责范本
2014/03/05 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
入党介绍人意见范文
2015/06/01 职场文书
贷款收入证明格式
2015/06/24 职场文书