斌哥的自我介绍小程序

Python算法之旅

共 5867字,需浏览 12分钟

 ·

2021-03-10 15:06

很幸运,成为了“边楚女特级教师工作站”的一名学员。

在举行开班仪式之前,边老师布置了一个先导任务:每位学员上传一个自我介绍小视频,要求有创意地介绍自己,体现本人教育思想、个性和特长。

我这段时间刚好在学习多线程编程技术,就把前面做的模拟烟花小程序和语音合成代码结合起来,再配上背景音乐,创作了一个自我介绍小程序。

程序不大,加上注释总共150行左右,但麻雀虽小五脏俱全,使用了多线程、语音合成、音频处理和鼠标键盘交互等技术。现在拿出来与大家分享,希望各位老师多多批评指正。


素材准备:

1. 照片若干(用作背景图片,海龟绘图只支持gif或png格式);
2. 自我介绍文本文件(为保证能全部显示,字数不要太多);
3. 背景音乐文件一个(mp3格式);
4. 预先安装pyttsx3、pygame和threading模块。


项目目标:

利用多线程实现海龟绘图、语音合成和音频播放同步进行,从而实现自我介绍小程序功能:

1. 绘制模拟烟花效果,点击鼠标左键燃放烟花

2. 实现键盘响应交互功能;

3. 实现逐行输出文字功能;

4. 实现朗读文本文件功能;

5. 实现播放背景音乐功能。


项目实施过程:

一、主函数代码说明。

1. 定义全局变量

import turtle as ttimport pyttsx3import threadingimport timeimport randomimport mathimport pygame
#可能要修改的配置参数#烟花渐变颜色colors = ['white','ivory', 'seashell', 'yellow', 'orange', 'red', 'firebrick', 'deepPink', 'Tomato1']text_x, text_y = -720, 220 #显示文字的左上角坐标PAUSE_TIME = 3000 #显示每行文字后停顿时间(以便与合成声音同步)MUSIC_TIME = 200 #播放音乐时间VOLUME = 0.5 #播放背景音乐音量(范围为0.0到1.0)

注释:烟花粒子颜色从白色渐变成番茄红,以更好地模拟实际烟花效果;根据屏幕大小,合理设置显示文字的左上角坐标;合理设置显示每行文字后停顿时间,以便与合成声音同步;降低背景音乐音量,以突出朗读文字的声音。

2. 创建3个线程,分别用来绘制烟花,播放背景音乐和朗读文字

if __name__ == '__main__':    with open('自我介绍.txt', 'r') as fp:        text = fp.readlines()            # 创建3个线程,分别用来绘制烟花,播放背景音乐和朗读文字    f1 = threading.Thread(target=fun_1, args=())    f2 = threading.Thread(target=fun_2,args=('菊次郎的夏天.mp3',))    f3 = threading.Thread(target=fun_3, args=(text,))    f1.start()    f2.start()    f3.start()    f1.join()    f2.join()    f3.join()


二、海龟绘图实现显示文字、点燃烟花和切换背景图片效果

1. 供线程f1调用的函数

# 海龟绘图实现显示文字、点燃烟花和切换背景图片效果def fun_1():    tt.TurtleScreen._RUNNING = True  # 启动绘图,在IDE中运行加这句可避免报错    tt.bgcolor("black")    tt.bgpic("幻灯片1.png")    tt.color('orange')    tt.left(90)    tt.hideturtle() #隐藏画笔    tt.tracer(0)
global number number = 0 write_text() tt.listen() tt.onkeypress(chang_pic_1, "1") #键盘响应 tt.onkeypress(chang_pic_2, "2") #键盘响应 tt.onkeypress(chang_pic_3, "3") #键盘响应 tt.onscreenclick(play_game, 1) #鼠标左键 global fireworks_list fireworks_list = [] count = 0 while True: count += 1 for fireworks in fireworks_list[:]: if count % 15 == 0: #每个粒子径迹数量为15 fireworks.clear() #清除径迹 if fireworks.is_over(): fireworks.clear() fireworks_list.remove(fireworks) else: fireworks.update() time.sleep(0.03) tt.update() #刷新每一帧画面
    tt.done()  # 结束绘图,这将不会关闭窗口

注释:本函数要实现显示文字和刷新烟花粒子径迹功能,并随时根据用户点击鼠标左键或按键情况生成相应效果。

2. 烟花类

class Fireworks(tt.Turtle):    def __init__(self, x, y):        tt.Turtle.__init__(self)        self.x, self.y = x, y #烟花中心点        self.g = 0.05 #模拟重力加速度        self.size = 3 #粒子大小        self.num = random.randint(100, 160) #粒子数量        self.lifespan = random.randint(25, 40) #粒子寿命        self.age = 0  #粒子当前年龄        self.mult = random.randint(1, 1) #各粒子放大倍数        self.v = [random.randint(3, 6) for i in range(self.num)] #各粒子初速度        self.a = [random.uniform(0, math.pi*2) for i in range(self.num)] #各粒子初始角度        self.color_num = [0 for i in range(self.num)] #各粒子颜色序号        self.speed(0)        self.penup()        self.hideturtle() #隐藏画笔
def is_over(self): # 粒子消失 return self.age > self.lifespan def draw_throw_shape(self): #绘制斜抛粒子 for i in range(self.num): x = self.x + (self.v[i] * math.cos(self.a[i]) * self.age) * self.mult y = self.y + (self.v[i] * math.sin(self.a[i]) * self.age - self.g * self.age ** 2) * self.mult self.penup() self.goto(x, y) self.pendown() #通过颜色渐变模拟烟花变色过程 self.color_num[i] = min(len(colors)-1, self.color_num[i] + random.randint(1, 120) // 100) self.color(colors[self.color_num[i]]) self.dot(self.size) def update(self): self.age += 1 if not self.is_over(): self.draw_throw_shape()

注释:根据斜抛运动规律,绘制大量粒子沿不同方向做斜抛运动的径迹图,并通过颜色渐变模拟烟花变色过程,实现漫天烟花效果。

3. 逐行输出文字

# 逐行输出文字def write_text():    global text_x, text_y, number    tt.penup()    tt.goto(text_x, text_y)    tt.pendown()    tt.color("gold")    tt.write(text[number], font=("华文行楷", 30))    text_y -= 50    number += 1    if number < len(text): #每隔PAUSE_TIME毫秒输出一行文字        tt.ontimer(write_text, PAUSE_TIME)

注释:定位要输出文字的左上角坐标,设置好要输出位置的颜色和字体等信息,使用tt.ontimer(write_text, PAUSE_TIME)方法,实现每隔PAUSE_TIME毫秒输出一行文字功能。

4. 在鼠标左键点击处生成一朵烟花

def play_game(x, y):    fireworks_list.append(Fireworks(x, y))

5. 键盘响应事件切换背景图片

def chang_pic_1():    tt.bgpic("幻灯片1.png")
def chang_pic_2(): tt.bgpic("幻灯片2.png")
def chang_pic_3(): tt.bgpic("幻灯片3.png")

注释按数字键1、2、3分别切换背景图片为幻灯片1.png、幻灯片2.png、幻灯片3.png。


三、使用pygame模块播放背景音乐

# 专门用来播放背景音乐的函数def fun_2(music_file):    pygame.mixer.init()#初始化音频    track = pygame.mixer.music.load(music_file)#载入音乐文件    pygame.mixer.music.set_volume(VOLUME) #来设置播放的音量,音量value的范围为0.0到1.0。    pygame.mixer.music.play()#开始播放    time.sleep(MUSIC_TIME)#播放时间    pygame.mixer.music.stop()#停止播放a

 注释:能够播放音频文件的模块有很多,因为在本项目中需要设置背景音乐的播放音量,所以挑选了简单易用的pygame模块。


四、使用pyttsx3模块朗读文本

# 专门用来朗读文字的函数def fun_3(text):    engine = pyttsx3.init()    for sentence in text:        engine.say(sentence)        engine.runAndWait()

 注释:能够合成语音的模块有很多,本项目选择了简单易用的pyttsx3模块,可以设置语速和音量等信息,很可惜只有2种声音可以选择。如果大家有更好的语音合成模块,欢迎推荐给我!


结语:

好了,到这里,就把“自我介绍小程序”各个模块的功能和代码实现都给大家做了详细的分析了。做这个小程序既是为了完成边老师布置的任务,也是对自己前期学习的一个综合实践,用到了一些比较实用的功能模块和编程技巧。
感兴趣的老师可以仔细研究一下案例中用到的pygame和pyttsx3等第三方模块,争取创作出更多更有趣的项目。
因为本项目的数据结构和算法原理都是自己闭门造车弄出来的,难免存在不足之处,欢迎各位老师批评指正。当然,如果你是新手,需要完整的代码,那可以加入“Python算法之旅”知识星球,下载完整的源代码。

需要本文word版的,可以加入“Python算法之旅”知识星球参与讨论和下载文件,Python算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。

我们专注Python算法,感兴趣就一起来!



相关优秀文章:

阅读代码和写更好的代码

最有效的学习方式

斌哥教你自制多功能单词本

斌哥教你自制象棋打谱软件

斌哥教你自制围棋打谱软件

斌哥教你自制思维导图生成器改进版

斌哥教你绘制文件夹目录树(一)

斌哥教你绘制文件夹目录树(二)

斌哥教你绘制文件夹目录树(三)

浏览 79
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报