大二上完Python课程,老师要求做一个课程设计,经过十几个小时的捣鼓之后,就有一个简易版的速读训练系统诞生啦~
主要有7个功能:
1.横向阅读(文本遍历、词云、时延等)
2.纵向阅读
3.横向提速
4.纵向提速
5.视幅扩展(画面按帧移动)
6.查询总训练时间
7.设置背景音乐(pygame)
速读理论和功能设计借鉴于精英特速读训练软件,当时觉得学了Python或许自己也能用代码实现APP里面的功能,真正动手构思用什么代码实现,调试,美化等才会发现挺不容易呀!放上代码,能在Python3.7上实现,仅供对速读训练感兴趣的小伙伴参考喔。
import time
import datetime
import re
import matplotlib.pyplot as plt
from PIL import Image
import wordcloud
import jieba
import pygame
from pygame.locals import*
import sys
import collections
def menu():
print('——简易速读训练系统——')
print('按1,横向阅读')
print('按2,纵向阅读')
print('按3,横向提速')
print('按4,纵向提速')
print('按5,视幅扩展')
print('按6,查询总训练时间')
print('按7,设置背景音乐')
def hxyd(delay=0.8):
f=open('D:\\春.txt','r',encoding='UTF-8')#打开文件
L=f.readline()#读取全部文本
m=re.findall(r'[^x]{1,15}',L)#正则表达式,以15个汉字为长度进行分割
for ch in m:#循坏输出字符串
print(ch,end='')#不换行输出字符串
time.sleep(delay)#输出一个字符串延迟0.8s
f.close()#关闭文件
print('\n')#空行
def zxyd(delay=0.8):
f=open('D:\\背影.txt','r',encoding='UTF-8')#打开文件
L=f.readline()#读取全部文本
m=re.findall(r'[^x]{1,15}',L)#正则表达式,以15个汉字为长度进行分割
for ch in m:
print(ch)#换行输出字符串
time.sleep(delay)#输出一个字符串延迟0.8s
f.close()#关闭文件
print('\n')#空行
def hxts(delay=0.4):
f=open('D:\\春.txt','r',encoding='UTF-8')
L=f.readline()
m=re.findall(r'[^x]{1,15}',L)
for ch in m:
print(ch,end='')
time.sleep(delay)#输出一个字符串延迟0.4s
f.close()
print('\n')
def zxts(delay=0.4):
f=open('D:\\背影.txt','r',encoding='UTF-8')
L=f.readline()
m=re.findall(r'[^x]{1,15}',L)
starttime=datetime.datetime.now()
for ch in m:
print(ch)
time.sleep(delay)#输出一个字符串延迟0.8s
f.close()
endtime=datetime.datetime.now()
duringtime=endtime-starttime
print('\n')
def ciyun1():
txt=open('D:\\春.txt','r',encoding='UTF_8').read()#以读方式打开文本文件
img=plt.imread('D:\\企鹅.jpg')#读入做遮罩的文本图片
new_data=re.findall('[\u4e00-\u9fa5]+',txt,re.S)#文本预处理,去掉一些无用的字符,只提取出中文出来
new_data="".join(new_data)
words_ls=jieba.cut(new_data,cut_all=True)#文本分词
result_list=[]
with open ('d:\\停词.txt',encoding='utf_8')as f:
con=f.readlines()
stop_words=set()
for i in con:
i=i.replace("\n","")#去掉读取每一行数据的\n
stop_words.add(i)
for word in words_ls:
if word not in stop_words and len(word)>1:#设置停用词,并去除单个词
result_list.append(word)
word_counts=collections.Counter(result_list)#筛选后统计词频
my_cloud=wordcloud.WordCloud(font_path='simhei.ttf',#设置字体为黑体
width=1000,height=500,#画布设置
max_words=100,#词云显示的最大词语数量
background_color='white',#设置背景为白色
mask=img,#设置遮罩图片为img
max_font_size=99,#设置字体最大值
min_font_size=10,#设置字体最小值
random_state=50#随机生成状态,即多少种配色
).generate_from_frequencies(word_counts)
plt.imshow(my_cloud)#显示程生成的词云
plt.axis('off')#关闭坐标轴
plt.show()#显示全部图形
def ciyun2():
txt=open('D:\\背影.txt','r',encoding='UTF_8').read()
img=plt.imread('D:\\彩色云朵.jpeg')
new_data=re.findall('[\u4e00-\u9fa5]+',txt,re.S)
new_data="".join(new_data)
words_ls=jieba.cut(new_data,cut_all=True)
result_list=[]
with open ('d:\\停词.txt',encoding='utf_8')as f:
con=f.readlines()
stop_words=set()
for i in con:
i=i.replace("\n","")
stop_words.add(i)
for word in words_ls:
if word not in stop_words and len(word)>1:
result_list.append(word)
word_counts=collections.Counter(result_list)
word_counts_top100=word_counts.most_common(100)
my_cloud=wordcloud.WordCloud(font_path='simhei.ttf',
width=1000,height=500,
background_color='white',
mask=img,
max_font_size=99,
min_font_size=10,
random_state=50
).generate_from_frequencies(word_counts)
plt.imshow(my_cloud)
plt.axis('off')
plt.show()
print("欢迎来到速读训练系统!确认过眼神,是对的人喔~")
pygame.mixer.init()#初始化
track=pygame.mixer.music.load(r"d:\中国国家交响乐团 - 德彪西:月光.mp3")
pygame.mixer.music.play()#开启背景音乐
starttime=datetime.datetime.now()
endtime=datetime.datetime.now()
duringtime1=endtime-starttime#将总训练时间初始化为0
duringtime2=endtime-starttime#将加入到总训练时长中的每个模块训练时长初始化为0
ans=True
while ans:#主循坏
menu()
ans=input("请输入数字:")
if ans=="1":
print("横向阅读训练\n")
duringtime=duringtime2#加入到总训练时间的时长清零
starttime=datetime.datetime.now()#开始计时
hxyd()
endtime=datetime.datetime.now()#结束计时
duringtime=endtime-starttime#计算时间差
print('\n横向阅读时长:',duringtime)#输出横向阅读时长
bns=True
while bns:
bns=input("生成词云请按1,否则请按2\n")
if bns=="1":
ciyun1()
break
if bns=="2":
break
if ans=="2":
print("纵向阅读训练\n")
duringtime=duringtime2#加入到总训练时间的时长清零
starttime=datetime.datetime.now()#开始计时
zxyd()
endtime=datetime.datetime.now()#结束计时
duringtime=endtime-starttime#计算时间差
print('\n纵向阅读时长:',duringtime)#输出纵向阅读时长
cns=True
while cns:
bns=input("生成词云请按1,否则请按2\n")
if bns=="1":
ciyun2()
break
if bns=="2":
break
if ans=="3":
print("横向提速训练\n")
duringtime=duringtime2
starttime=datetime.datetime.now()
hxts()
endtime=datetime.datetime.now()
duringtime=endtime-starttime
print('\n横向提速阅读时长:',duringtime)
dns=True
while dns:
dns=input("生成词云请按1,否则请按2\n")
if dns=="1":
ciyun1()
break
if dns=="2":
break
if ans=="4":
print("纵向提速训练\n")
duringtime=duringtime2
starttime=datetime.datetime.now()
zxts()
endtime=datetime.datetime.now()
duringtime=endtime-starttime
print('\n纵向提速阅读时长:',duringtime)
ens=True
while ens:
ens=input("生成词云请按1,否则请按2\n")
if ens=="1":
ciyun2()
break
if ens=="2":
break
if ans=="5":
print("视幅扩展训练\n")
pygame.init() #初始化pygame类
screen = pygame.display.set_mode((600,800)) #设置窗口大小
pygame.display.set_caption('视幅扩展') #设置窗口标题
image = pygame.image.load('d:\\圆形扩展12.jpg') #加载图片
tick = pygame.time.Clock()
frameNumber = 6 #设置帧数,示例图片有6帧
frameRect = image.get_rect()#获取全图的框体数据,以此计算单帧框体
frameRect.width //= frameNumber #获取每一帧的边框数据,实例图片之只有一行,所以单帧高度和整体图片高度相等
fps = 2 #设置刷新率,数字越大刷新率越高
fcclock = pygame.time.Clock()
n = 0 #这算是一个magic number吧,是为了计算框体位置所引用的一个计算变量
num=0
duringtime=duringtime2#加入到总训练时间的时长清零
starttime=datetime.datetime.now()#开始计时
while num < 60:
for event in pygame.event.get(): #事件检测,如果点击右上角X,则程序退出,没有这个循环的话,窗口可能会在打开时闪退。
if event.type == pygame.QUIT:
exit()
if n < frameNumber:
frameRect.x = frameRect.width * n #这里通过移动单帧矿体的x轴坐标实现单帧框体位移
n += 1
else:
n = 0
screen.fill((255,255,255))#设置背景为白色
screen.blit(image, (200,200),frameRect)#这里给了3个实参,分别是图像,绘制的位置,绘制的截面框
fcclock.tick(fps) #设置图像刷新率,如果刷新率太高,图像闪的太厉害
pygame.display.flip() #刷新窗口
num+=1
endtime=datetime.datetime.now()#结束计时
duringtime=endtime-starttime#计算时间差
print('视幅扩展时长:',duringtime)#输出视幅扩展训练时长
print('\n')
if ans=="6":
print("查询总训练时长")
duringtime=duringtime2#加入到总训练时间的时长清零
print("总训练时间为:",duringtime1)#输出总训练时长
print('\n')#输出空行
if ans=="7":
print("设置背景音乐\n")
duringtime=duringtime2#加入到总训练时间的时长清零
gns=input("关闭背景音乐按1,打开背景音乐按2\n")
if gns == "1":
pygame.mixer.music.pause()#关闭背景音乐
if gns == "2":
pygame.mixer.music.unpause()#开启背景音乐
duringtime1=duringtime1+duringtime#将各个训练时长加入到总训练时长中
运行结果图:
1横向阅读生成词云
2视幅扩展