[转载] 使用Python编写打字训练小程序

参考链接: 在Python中切换大小写(替换)

你眼中的程序猿 

 

别人眼中的程序猿,是什么样子?打字如飞,各种炫酷的页面切换,一个个好似黑客般的网站破解。可现实呢? 二指禅的敲键盘,写一行代码,查半天百度…那么如何能让我们从外表上变得更像一个程序猿呢?当然是训练我们的打字速度了啊! 

训练打字 

很羡慕那些盲打速度炒鸡快的人,看起来就比较炫酷。但很多IT男打字速度并不快,甚至还有些二指禅的朋友们,太影响装13效果了。那么今天我们就来使用Python写一个打字训练的小工具吧。先来看看使用效果… 

 

我们使用Python内置的GUI模块Tkinter来编写一个打字测试的小工具。点击开始测试,系统随机生成20个字符串,然后用户按照题目进行作答后,点击交卷,系统将对比我们的输入结果,来计算正确率,并使用涂色将系统与用户的答案进行对比。 

生成随机数 

首先我们需要生成键盘上的字符。当然我们可以0-9,A-Z,a-z,!-)等等的一个个枚举出键盘上的按键。但有没有更快捷的操作呢?你需要了解下string模块。这里介绍下几个string默认提供的内容: 

import string

# 列举数字

string.digits

>>> '0123456789'

# 列举小写字母

string.ascii_lowercase

>>> 'abcdefghijklmnopqrstuvwxyz'

# 列举大写字母

string.ascii_uppercase

>>> 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

# 列举所有标点符号

string.punctuation

>>> '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

# 列举所有空白符

string.whitespace

>>> ' \t\n\r\x0b\x0c'

 

string.ascii_letters =

    string.ascii_lowercase + string.ascii_uppercase

string.printable =

    string.ascii_letters + string.digits

    + string.whitespace + string.punctuation 

剩余的内容,我们只需要进行相关读写判断即可,整体代码如下: 

# -*- coding: utf-8 -*-

# @Author   : 王翔

# @JianShu  : 清风Python

# @Date     : 2019/8/25 20:59

# @Software : PyCharm

# @version  :Python 3.7.3

# @File     : TypingTest.py

 

from tkinter import *

import random

import string

from datetime import datetime

 

root = Tk()

root.title("Python打字练习题 By:清风Python")

Label(root, text='系统题目:').grid(row=0)

Label(root, text='用户作答:').grid(row=1)

Label(root, text='考试结果:').grid(row=2)

v1 = StringVar()

v2 = StringVar()

v3 = StringVar()

v1.set("点击'开始测试'按钮开始出题")

e1 = Entry(root, text=v1, state='disabled', width=40, font=('宋体', 14))

e2 = Entry(root, textvariable=v2, width=40, font=('宋体', 14))

e3 = Label(root, textvariable=v3, width=40, font=('宋体', 10), foreground='red')

e1.grid(row=0, column=1, padx=10, pady=20)

e2.grid(row=1, column=1, padx=10, pady=20)

e3.grid(row=2, column=1, padx=10, pady=20)

text = Text(root, width=80, height=7)

text.grid(row=4, column=0, columnspan=2, pady=5)

 

 

class TypingTest:

    def __init__(self):

        self.time_list = []

        self.letterNum = 20

        self.letterStr = ''.join(random.sample(string.printable.split(' ')[0], self.letterNum))

        self.examination_paper = ''

 

    def time_calc(self):

        self.time_list.append(datetime.now())

        yield

 

    def create_exam(self):

        text.delete(0.0, END)

        # e3.delete(0, END)

        v1.set(self.letterStr)

        self.time_calc().__next__()

        text.insert(END, "开始:%s \n" % str(self.time_list[-1]))

        user_only1.config(state='active')

 

    def score(self):

        wrong_index = []

        self.time_calc().__next__()

        text.insert(END, "结束:%s\n" % str(self.time_list[-1]))

        use_time = (self.time_list[-1] - self.time_list[-2]).seconds

        self.examination_paper = v2.get()

        if len(self.examination_paper) > self.letterNum:

            v3.set("输入数据有误,作答数大于考题数")

        else:

            right_num = 0

            for z in range(len(self.examination_paper)):

                if self.examination_paper[z] == self.letterStr[z]:

                    right_num += 1

                else:

                    wrong_index.append(z)

            if right_num == self.letterNum:

                v3.set("完全正确,正确率%.2f%%用时:%s秒" % ((right_num * 1.0) / self.letterNum * 100, use_time))

            else:

                v3.set("正确率%.2f%%用时:%s 秒" % ((right_num * 1.0) / self.letterNum * 100, use_time))

                # e2.delete(0, END)

                text.insert(END, "题目:%s\n" % self.letterStr)

                tag_info = list(map(lambda x: '4.' + str(x + 3), wrong_index))

                text.insert(END, "作答:%s\n" % self.examination_paper)

                for i in range(len(tag_info)):

                    text.tag_add("tag1", tag_info[i])

                    text.tag_config("tag1", background='red')

                    user_only1.config(state='disabled')

 

 

TypingTest = TypingTest()

Button(root, text="开始测试", width=10, command=TypingTest.create_exam).grid(row=3, column=0, sticky=W, padx=30, pady=5)

user_only1 = Button(root, text="交卷", width=10, command=TypingTest.score, state='disable')

user_only1.grid(row=3, column=1, sticky=E, padx=30, pady=5)

 

mainloop() 

我们将最终的代码,打包成exe工具,即可脱离python环境,在单独的电脑上执行exe文件玩我们自己的打字练习题了: 

 

The End 

OK,今天的内容就到这里,如果觉得内容对你有所帮助,欢迎点击文章右下角的“在看”。 期待你关注我的公众号清风Python,如果觉得不错,希望能动动手指转发给你身边的朋友们。 

作者:清风Python 

  

相关推荐 

Python大神编程常用4大工具,你用过几个? 

使用Python连接Kerberos的Presto 

基于Atlas 200 DK的原版YOLOv3(基于Darknet-53)实现(Python版本) 

赶在520之前,程序员如何用Python送上最特别的“我爱你”表白 

【Python算法】分类与预测——Python随机森林 

Python一秒搭建ftp服务器,帮助你在局域网共享文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell两个数字相乘_使用8086微处理器将两个16位数字相乘而不带进位

shell两个数字相乘Problem statement: 问题陈述&#xff1a; To perform multiplication operation between 2 16bit numbers with carry using 8086 Microprocessor. 使用8086微处理器在2个16位数字之间进行带进位的乘法运算。 Algorithm: 算法&#xff1a; Load the first…

Dwr 框架简单实例

Dwr 是一个 Java 开源库&#xff0c;帮助你实现Ajax网站。 它可以让你在浏览器中的Javascript代码调用Web服务器上的Java&#xff0c;就像在Java代码就在浏览器中一样。 Dwr 主要包括两部分&#xff1a; 在服务器上运行的 Servlet 来处理请求并把结果返回浏览器。 运行在浏览器…

[转载] Python进阶:设计模式之迭代器模式

参考链接&#xff1a; Python中的迭代器 在软件开发领域中&#xff0c;人们经常会用到这一个概念——“设计模式”&#xff08;design pattern&#xff09;&#xff0c;它是一种针对软件设计的共性问题而提出的解决方案。在一本圣经级的书籍《设计模式&#xff1a;可复用面向对…

JavaScript | 如何为变量分配十进制,八进制和十六进制值?

Just like C programming language, we can assign integer value in the different format to the variable. 就像C编程语言一样 &#xff0c;我们可以将不同格式的整数值分配给变量。 Assigning decimal value: It can be assigned simply without using any prefix. 分配十…

路由器DHCP和DHCP中继的配置

路由器 DHCP和DHCP中继的配置 路由器作为DHCP服务器&#xff1a; 1.配置router的地址&#xff1a;Route(config)# hostname gateway (更改主机名字) Gateway(config)# interface gigabitethernet 0/0 …

[转载] 大数据分析Python For循环教程

参考链接&#xff1a; Python中的迭代器函数1 大数据分析Python除了循环遍历列表之外&#xff0c;for循环还有很多其他功能&#xff0c;在现实世界的数据科学工作中&#xff0c;您可能需要将numpy数组和pandas DataFrames用于其他数据结构的循环。 大数据分析Python For循环教…

node.js 爬虫入门总结

node.js爬虫 前端同学可能向来对爬虫不是很感冒&#xff0c;觉得爬虫需要用偏后端的语言&#xff0c;诸如 php &#xff0c; python 等。当然这是在 nodejs 前了&#xff0c;nodejs 的出现&#xff0c;使得 Javascript 也可以用来写爬虫了。由于 nodejs 强大的异步特性&#xf…

数组重复次数最多的元素递归_使用递归计算链接列表中元素的出现次数

数组重复次数最多的元素递归Solution: 解&#xff1a; Required function: 所需功能&#xff1a; func_occurence ( node *temp) //recursive functionInput: 输入&#xff1a; A singly linked list whose address of the first node is stored in a pointer, say head and…

SecureCRT中文乱码解决方法

服务端export LANGzh_CN.UTF-8客户端SecureCRT编码选择UTF-8客户端SecureCRT字体选择新宋体&#xff0c;字符集选择中文总结&#xff1a;客户端和服务端字符编码一致&#xff0c;客户端字体字符集支持转载于:https://blog.51cto.com/leomars/1972669

[转载] Python 迭代器 深入理解 与应用示例

参考链接&#xff1a; Python | 可迭代和迭代器之间的区别 本篇文章简单谈谈可迭代对象&#xff0c;迭代器和生成器之间的关系。 三者简要关系图 可迭代对象与迭代器 刚开始我认为这两者是等同的&#xff0c;但后来发现并不是这样&#xff1b;下面直接抛出结论&#xff1a; 1…

Python程序查找表示O(1)复杂度的数字所需的位数

Problem statement 问题陈述 Find total Number of bits required to represent a number in binary 查找以二进制表示数字所需的总位数 Example 1: 范例1&#xff1a; input : 10output: 4Example 2: 范例2&#xff1a; input : 32output : 6Formula used: 使用的公式&am…

正则split

string content "第1行导入失败&#xff0c;失败原因为&#xff1a; 《加班原因》字段必填";string[] resultString Regex.Split(content, "失败原因为&#xff1a;", RegexOptions.IgnoreCase);foreach (string i in resultString){Console.WriteLine(i…

将八进制数制转换为二进制,十进制和十六进制数制

1)将八进制数制转换为二进制数制 (1) Conversion of Octal Number System to Binary Number System) To convert octal numbers into binary numbers, we can use the relationship between octal and binary numbers. 要将八进制数转换为二进制数&#xff0c;我们可以使用八进…

[转载] Python的生成器

参考链接&#xff1a; Python中的生成器Generator Python的生成器 什么是生成器 创建python迭代器的过程虽然强大&#xff0c;但是很多时候使用不方便。生成器是一个简单的方式来完成迭代。简单来说&#xff0c;Python的生成器是一个返回可以迭代对象的函数。 怎样创建生…

想提高用户访问的响应速度和成功率还不赶快学习CDN

2019独角兽企业重金招聘Python工程师标准>>> 课程介绍 CDN可以将源站内容分发至最接近用户的节点&#xff0c;使用户可就近取得所需内容&#xff0c;提高用户访问的响应速度和成功率。解决因分布、带宽、服务器性能带来的访问延迟问题&#xff0c;适用于站点加速、点…

[转载] python迭代器、生成器和装饰器

参考链接&#xff1a; 有效地在Python中使用迭代 文章目录 生成器生成器表达式(generator expression)通过使用yield关键字定义生成器并行前戏高潮 迭代器迭代器概述iter()函数 创建迭代器创建一个迭代器(类)内置迭代器工具count无限迭代器cycle 无限迭代器&#xff0c;从一个…

java中的starts_Java Math类静态double nextAfter(double starts,double direction)示例

java中的starts数学类静态double nextAfter(双向启动&#xff0c;双向) (Math Class static double nextAfter(double starts , double directions) ) This method is available in java.lang package. 此方法在java.lang包中可用。 This method is used to return the double …

Python 核心编程(第二版)——条件和循环

Python 中的 if 子句由三部分组成: 关键字本身&#xff0c;用于判断结果真假的条件表达式&#xff0c; 以及当表达式为真或者非零时执行的代码块。if 语句的语法如下: if expression: expr_true_suite 单个 if 语句可以通过使用布尔操作符 and , or 和 not实现多重判断条件或…

[转载] 【python魔术方法】迭代器(__iter__和__next__)

参考链接&#xff1a; Python __iter __()和__next __()| 将对象转换为迭代器 文章目录 __iter__ 和 __next__真正的迭代器总结 python里面有很多的以__开始和结尾的函数&#xff0c;利用它们可以完成很多复杂的逻辑代码&#xff0c;而且提高了代码的简洁性&#xff0c;本文主…

Silverlight 异步单元测试

Silverlight 中的很多操作都是异步的&#xff0c;很多情况下要求单元测试也是异步的&#xff0c;但是介绍异步单元测试的文档很少。通过对 Silverlight Toolkit 中的 Microsoft.Silverlight.Testing 和 Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight 这两个文件…