Python少兒創意程式設計_新年快樂音樂賀卡.py 作者:李興球
"""Python少兒創意程式設計_新年快樂音樂賀卡.py 風火輪少兒程式設計就是原來的星空培訓(萍鄉星空少兒程式設計). 本程式使用python3.7,需要準備枕頭模組(PIL在python3中已更名為pillow模組) 更新制作日期:2018年11月12日 作者:李興球,本原始碼及素材下載網址: http://www.scratch8.net/download/newyear.rar
這是一個用python製作的多媒體動畫,以前做過類似的,這個是更新版。把拆幀的程式碼單獨分出去一個模組叫yeartools.py。它在最下面,沒有素材執行不了,會報錯,當然你也可以自己準備好素材,需要素材請聯絡本人。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.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)