用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实现求解一元二次方程的方法示例
Jun 20 Python
Python matplotlib的使用并自定义colormap的方法
Dec 13 Python
pandas DataFrame 删除重复的行的实现方法
Jan 29 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
Feb 16 Python
如何安装2019Pycharm最新版本(详细教程)
Sep 26 Python
用Python在Excel里画出蒙娜丽莎的方法示例
Apr 28 Python
python使用多线程+socket实现端口扫描
May 28 Python
python右对齐的实例方法
Jul 05 Python
详解基于python的图像Gabor变换及特征提取
Oct 26 Python
地图可视化神器kepler.gl python接口的使用方法
Dec 22 Python
解决import tensorflow导致jupyter内核死亡的问题
Feb 06 Python
pytorch中的model.eval()和BN层的使用
May 22 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
解析coreseek for sphinx的使用
2013/06/21 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
2013/06/23 PHP
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
用javascript实现分割提取页面所需内容
2007/05/09 Javascript
Jquery 插件学习实例1 插件制作说明与tableUI优化
2010/04/02 Javascript
页面实时更新时间的JS实例代码
2013/12/18 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
2014/01/02 Javascript
JQuery实现动态表格点击按钮表格增加一行
2014/08/24 Javascript
Jquery ajax请求导出Excel表格的实现代码
2016/06/08 Javascript
详谈表单重复提交的三种情况及解决方法
2017/08/16 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
浅谈在node.js进入文件目录的问题
2018/05/13 Javascript
5分钟学会Vue动画效果(小结)
2018/07/21 Javascript
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
在Python中使用base64模块处理字符编码的教程
2015/04/28 Python
利用Python获取操作系统信息实例
2016/09/02 Python
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
使用pandas read_table读取csv文件的方法
2018/07/04 Python
pandas中read_csv的缺失值处理方式
2019/12/19 Python
基于SpringBoot构造器注入循环依赖及解决方式
2020/04/26 Python
解决python 执行sql语句时所传参数含有单引号的问题
2020/06/06 Python
Numpy(Pandas)删除全为零的列的方法
2020/09/11 Python
Myholidays美国:在线旅游网站
2019/08/16 全球购物
美国校服网上商店:French Toast
2019/10/08 全球购物
兰蔻俄罗斯官方网站:Lancome俄罗斯
2019/12/09 全球购物
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
大学生翘课检讨书范文
2014/10/06 职场文书
秋收起义观后感
2015/06/11 职场文书