Python少儿创意编程_新年快乐音乐贺卡.py 作者:李兴球

版权声明:所有文章皆为李兴球先生原创,转载请注明出处,否则保留权利,追究责任。 https://blog.csdn.net/avskya/article/details/83992835

"""Python少儿创意编程_新年快乐音乐贺卡.py
   风火轮少儿编程就是原来的星空培训(萍乡星空少儿编程).
   本程序使用python3.7,需要准备枕头模块(PIL在python3中已更名为pillow模块)
   更新制作日期:2018年11月12日
   作者:李兴球,本源代码及素材下载网址:
   http://www.halifa.net/download/newyear.rar

   这是一个用python制作的多媒体动画,以前做过类似的,这个是更新版。把拆帧的代码单独分出去一个模块叫yeartools.py。它在最下面,没有素材运行不了,会报错,当然你也可以自己准备好素材,需要把screen的colormode设为255。Python的海龟模块可不仅仅是用来画图哦,这里用它来做多媒体动画。
"""
__author__ = "李兴球"
__date__ = "2018年11月12日"

from winsound import PlaySound,SND_ASYNC
from turtle import *
from time import sleep
from random import randint
import time,os
from yeartools import *

#nezha_sentence = "哪吒作为顶天立地的神话英雄,他不仅神力通天,法力高强,武功高强,还是位镇守在一带其信仰地区的大型吉祥物,他英勇善战,驱邪除恶,诛灭牛鬼蛇神,是妖魔鬼怪的克星,象征着福娃类的福神之尊,被供为斩妖除魔、降龙伏虎的少年英雄。"

project_name = "风火轮少儿编程过新年音乐贺卡"
imagefile = "新年快乐.gif"
images_list,width,height = split_gifimage(imagefile)
color_list = ['cyan','yellow','white','yellow','yellow']
position_list = [(-150,50),(-280,0),(-200,-50),(-240,-170),(-240,-200)]
strings = ['风火轮少儿编程','祝大家新年快乐,幸福美满,吉祥如意!','本作品更新日期:2018年11月12日! 作者:李兴球','本作品源代码与素材下载网址:','http://www.scratch8.net/download/newyear.rar']
fonts = [("微软雅黑",32,"normal"),("",20,"normal"),("",12,"normal"),("",12,"normal"),("",16,"normal")]
dx_list  = [45,30,16,16,12]
delay_list  = [0.1,0.1,0,0,0]

screen = Screen()

screen.colormode(255)
screen.setup(width,height+100) 
screen.title(project_name)
screen.bgcolor((0,0,51))
screen.bgpic("背景.png") 

piter=Turtle(visible=False )
piter.pencolor("white")
piter.penup()
piter.speed(0) 
"""打星星代码段"""
for i in range(30):                                 #随机打点
    piter.goto(randint(-300,250),randint(-150,150))
    piter.dot(randint(2,4))

"""写字代码段"""
for i in range(5):                                  #写五line字,内容,大小,风格,颜色都不同
    stepwrite(piter,color_list[i],position_list[i],strings[i],fonts[i],dx_list[i],delay_list[i])
                       

for i in range(300):
    sleep(0.01)
    screen.update()
screen.cv.postscript(file="风火轮少儿编程(请用photoshop打开).ps") #保存为ps图像文件,photoshop能解析.
f = open("风火轮少儿编程.txt",mode= 'w')      #打开文件,以写模式
f.write(__doc__)                              #保存python源代码文件的说明文档
f.close()                                     #关闭文件

piter.clear()
piter.color("white")

"""背景切换代码段"""
index=0
def alt_background():
    global index
    screen.bgpic(images_list[index])
    index=index+1
    index=index % 5
    screen.ontimer(alt_background,100)    
alt_background()

"""在舞台上印歌词代码段"""
piter.goto(0,-230)
song_file="中国娃娃 - 发财发福中国年.wav"    #歌曲文件
lrc_file="发财发福中国年歌词.lrc"            #歌词文件
words_list=[]                                #歌词列表
words_index=0

f=open(lrc_file)
words_=f.readlines()                         
f.close()
words_list=[ line.strip() for line in words_ if len(line)>1]  
words_lines=len(words_list)


PlaySound(song_file, SND_ASYNC) #异步播放音效

def get_time_axis(index):
    """获取时间轴"""
    songtime=words_list[index]
    songtime=songtime.split("]")[0]
    songtime=songtime.split(":")
    songtimef=songtime[0][1:3]
    songtimef=int(songtimef)*60    
    songtimem=float(songtime[1])
    return int((songtimef+songtimem)*1000)
 

words_index=0
begin_time=time.time()
def display_subtitle():
    """随着音乐显示歌词函数"""
    global words_index            #歌词索引号
    global words_lines            #歌词line数
    
    current_time=time.time()
    running_time=(current_time-begin_time)*1000
    screen.title(project_name + "," + str(running_time))
    if get_time_axis(words_index)<running_time:
        piter.clear()
        display_words_=words_list[words_index].split("]")[1]
        piter.goto(0,-230)
        piter.pencolor("black")
        piter.write(display_words_,align='center',font=("",24,"normal"))
        piter.goto(-1,-229)
        piter.pencolor("white")
        piter.write(display_words_,align='center',font=("",24,"normal"))
        
        #print("当前words_index:" + str(words_index) + ",words_:" + display_words_) 
        words_index=words_index+1
    if words_index<words_lines:        
        screen.ontimer(display_subtitle,100)
        
display_subtitle()
screen.mainloop()

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

以下是yeartools.py模块源代码:

from PIL import Image,ImageSequence
import os,time

def split_gifimage(filename):
    """拆帧到文件夹,形成png文件"""
    if not os.path.exists(filename):return
    filename = os.path.split(filename)[-1]
    basename = os.path.splitext(filename)[0]
    if not os.path.exists(basename):os.mkdir(basename)
    
    gif_image = Image.open(filename)  #载入图片
    w,h=gif_image.size
    #ImageSequence.Iterator(图象) 能返回图形中的每一帧。

    index = 1
    frames_list=[]

    for frame in ImageSequence.Iterator(gif_image):  #对于图形中的每一帧
        文件名= basename + os.sep + basename + str(index) + ".png"
        frame.save(文件名)
        frames_list.append(文件名)
        index += 1

    print( "拆分gif完毕!共拆成了" + str(index-1) + "张png图片")
    return frames_list,w,h


def stepwrite(t,color,position,string,fontstyle,dx,delay):
    """ t:海龟对象,color:画笔颜色,position:坐标元组,string:要写的字
        fontstyle:字的风格,三元组,dx:水平方向移动的间隔
    """
    t.color(color)
    t.goto(position)
    for char in string:
        t.write(char,font = fontstyle)
        time.sleep(delay)
        t.setx(t.xcor() + dx)
 


 

展开阅读全文

没有更多推荐了,返回首页