[轉載] 使用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.pswp.cn/news/540484.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540484.shtml
英文地址,請注明出處:http://en.pswp.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 這兩個文件…