斌哥的自我介绍小程序
很幸运,成为了“边楚女特级教师工作站”的一名学员。
在举行开班仪式之前,边老师布置了一个先导任务:每位学员上传一个自我介绍小视频,要求有创意地介绍自己,体现本人教育思想、个性和特长。
我这段时间刚好在学习多线程编程技术,就把前面做的模拟烟花小程序和语音合成代码结合起来,再配上背景音乐,创作了一个自我介绍小程序。
程序不大,加上注释总共150行左右,但麻雀虽小五脏俱全,使用了多线程、语音合成、音频处理和鼠标键盘交互等技术。现在拿出来与大家分享,希望各位老师多多批评指正。
素材准备:
项目目标:
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()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 numbernumber = 0write_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_listfireworks_list = []count = 0while True:count += 1for fireworks in fireworks_list[:]:if count % 15 == 0: #每个粒子径迹数量为15fireworks.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, yself.g = 0.05self.size = 3self.num = random.randint(100, 160)self.lifespan = random.randint(25, 40)self.age = 0self.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.lifespandef draw_throw_shape(self):for i in range(self.num):x = self.x + (self.v[i] * math.cos(self.a[i]) * self.age) * self.multy = self.y + (self.v[i] * math.sin(self.a[i]) * self.age - self.g * self.age ** 2) * self.multself.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 += 1if not self.is_over():self.draw_throw_shape()
注释:根据斜抛运动规律,绘制大量粒子沿不同方向做斜抛运动的径迹图,并通过颜色渐变模拟烟花变色过程,实现漫天烟花效果。
3. 逐行输出文字:
# 逐行输出文字def write_text():global text_x, text_y, numbertt.penup()tt.goto(text_x, text_y)tt.pendown()tt.color("gold")tt.write(text[number], font=("华文行楷", 30))text_y -= 50number += 1if 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种声音可以选择。如果大家有更好的语音合成模块,欢迎推荐给我!
结语:
需要本文word版的,可以加入“Python算法之旅”知识星球参与讨论和下载文件,“Python算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。
我们专注Python算法,感兴趣就一起来!
相关优秀文章:
