斌哥的自我介绍小程序
共 5867字,需浏览 12分钟
·
2021-03-10 15:06
很幸运,成为了“边楚女特级教师工作站”的一名学员。
在举行开班仪式之前,边老师布置了一个先导任务:每位学员上传一个自我介绍小视频,要求有创意地介绍自己,体现本人教育思想、个性和特长。
我这段时间刚好在学习多线程编程技术,就把前面做的模拟烟花小程序和语音合成代码结合起来,再配上背景音乐,创作了一个自我介绍小程序。
程序不大,加上注释总共150行左右,但麻雀虽小五脏俱全,使用了多线程、语音合成、音频处理和鼠标键盘交互等技术。现在拿出来与大家分享,希望各位老师多多批评指正。
素材准备:
项目目标:
1. 绘制模拟烟花效果,点击鼠标左键燃放烟花;
2. 实现键盘响应交互功能;
3. 实现逐行输出文字功能;
4. 实现朗读文本文件功能;
5. 实现播放背景音乐功能。
项目实施过程:
一、主函数代码说明。
1. 定义全局变量:
import turtle as tt
import pyttsx3
import threading
import time
import random
import math
import 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 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种声音可以选择。如果大家有更好的语音合成模块,欢迎推荐给我!
结语:
需要本文word版的,可以加入“Python算法之旅”知识星球参与讨论和下载文件,“Python算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。
我们专注Python算法,感兴趣就一起来!
相关优秀文章: