0
点赞
收藏
分享

微信扫一扫

Python课程设计:简易速读训练系统

芒果六斤半 2022-04-16 阅读 58
python

大二上完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视幅扩展

 

 

举报

相关推荐

0 条评论