让小乌龟可以唱歌——对Python turtle进行拓展
在Scratch中,小貓是可以唱歌的,而且Scratch的聲音木塊有著豐富的功能,在這方面Python turtle略有欠缺,今天我們就來(lái)完善一下.
Python聲音模塊
Python處理聲音的模塊很多,但是我們要實(shí)現(xiàn)的功能并不復(fù)雜,所以只需要用到winsound這個(gè)系統(tǒng)自帶的模塊就好了.我們要的只是實(shí)現(xiàn)類似scratch的功能,用不到很復(fù)雜的功能的,當(dāng)然Python能夠做的比scratch多多了.
Python turtle的代碼結(jié)構(gòu)
最近一直在閱讀python turtle的源代碼對(duì)于Python源代碼的結(jié)構(gòu)有所了解,針對(duì)造型的操作也重新定義了一些函數(shù)來(lái)與scratch的積木塊相對(duì)應(yīng)。
在Python turtle基礎(chǔ)上進(jìn)行擴(kuò)充而不是使用Pygame、Pyglet等復(fù)雜的庫(kù)是因?yàn)镻ython turtle本身為了教小孩子編程設(shè)計(jì)的,在結(jié)構(gòu)上更加符合小孩子的學(xué)習(xí)習(xí)慣,對(duì)交互式編程友好,而pygame和pyglet不具備這兩個(gè)特點(diǎn)。
class RawTurtle(TPen, TNavigator):# 小烏龜?shù)膭?dòng)畫部分# 為何添加的函數(shù)不工作呢"""Animation part of the RawTurtle.Puts RawTurtle upon a TurtleScreen and provides tools forits animation."""其中核心的turtle繼承自RawTurtle類,而RawTurtle繼承自TPen和TNavigator,兩個(gè)類分別控制畫筆的繪制和移動(dòng),簡(jiǎn)單的來(lái)說(shuō)TPen承載的是類似Scratch中畫筆積木類的功能,而TNavigator更多的承載了動(dòng)作積木類的功能。
上面兩組功能是否很相似呢。
所以要實(shí)現(xiàn)Python turtle的聲音功能,只要重新寫一個(gè)聲音相關(guān)的類,然后讓RawTurtle繼承這個(gè)聲音類就ok了,當(dāng)然還要注意一個(gè)問(wèn)題,turtle所有的類都要加入到_tg_turtle_functions這個(gè)列表中,這個(gè)列表保存了turtle所有的方法,用來(lái)保證在交互式命令行里,默認(rèn)turtle的各種方法可以直接作為函數(shù)調(diào)用.
讓我們開工把
實(shí)現(xiàn)TSound類
Scratch積木塊對(duì)應(yīng)的Python
我們一步步的來(lái)實(shí)現(xiàn)
對(duì)winsound模塊的同學(xué),可以訪問(wèn)其在官方的文檔,這里介紹播放聲音的方法:
winsound.PlaySound('d:\coding\maow.wav',winsound.SND_FILENAME) # 第一個(gè)參數(shù)是文件的完整路徑,第二個(gè)是播放的標(biāo)志,winsound.SND_FILENAME代表的是播放的是文件首先我們導(dǎo)入winsound模塊之后,然后利用這個(gè)模塊的PlaySound方法播放指定的聲音文件這樣就實(shí)現(xiàn)了
停止聲音的辦法是:
winsound.PlaySound(None, winsound.SND_PURGE)對(duì)應(yīng)的是
默認(rèn)的聲音播放方式是同步的,也就是說(shuō)播放聲音的時(shí)候程序啥也不能干,如下面播放5分鐘的音頻:
import winsound as s s.PlaySound("d:\coding\sound.wav",s.SND_FILENAME) print('Playing ended!')如果這五分鐘的音頻sound.wav沒有播放完畢,程序啥也不能干,尬不尬.
這個(gè)積木塊比較霸道,要求必須等他做完了才可以,本來(lái)就相當(dāng)于你跟你女朋友打電話,一般我是邊打電話邊做事情,但是女朋友呢非得要求你啥也不能做,直到電話打完,不然就是不尊重她,不愛她,真尬.當(dāng)然了少年們,跟女朋友打電話的時(shí)候一定不要做別的事情哦.
如何實(shí)現(xiàn)異步播放聲音呢,畢竟我們是熱愛時(shí)間的好少年.
這里要用到的是同步標(biāo)志winsound.SND_ASYNC
雖然同樣是5分鐘的音頻,可是后面的語(yǔ)句很明顯的執(zhí)行了.
實(shí)現(xiàn)TSound類
import winsound as snd # 導(dǎo)入聲音類class TSound(object):"""Sounding part of the RawTurtleImplements sounding methods"""def __init__(self, soundfile, resizemode=_CFG["resizemode"]):# 其實(shí)Sound并不涉及畫筆的移動(dòng)和繪制,resizemode不加也是可以滴self._soundfile = soundfiledef play(self, soundfile):snd.PlaySound("d:\coding\sound.wav", snd.SND_ASYNC)def playuntil(self, soundfile):snd.PlaySound("d:\coding\sound.wav", snd.SND_FILENAME)def stopall(self):snd.PlaySound(None, snd.SND_PURGE)首先導(dǎo)入winsound模塊并重命名為snd,然后生命TSound類,定義三個(gè)函數(shù),實(shí)現(xiàn)播放,播放直到和停止所有聲音的功能,當(dāng)然這也僅僅是個(gè)實(shí)現(xiàn)而已,要真的完善還是需要比較長(zhǎng)的時(shí)間,只是給大家簡(jiǎn)單的舉個(gè)例子,這個(gè)其實(shí)可以對(duì)照register_shape和shape函數(shù)來(lái)定義和完善的.
讓RawTurtle繼承TSound類
class RawTurtle(TPen, TNavigator, TSound):# 小烏龜?shù)膭?dòng)畫部分# 為何添加的函數(shù)不工作呢"""Animation part of the RawTurtle.Puts RawTurtle upon a TurtleScreen and provides tools forits animation."""將TSound的方法添加到Turtle的函數(shù)列表
我把修改后的文件重命名為pycat,然后導(dǎo)入:
注意我用IDLE新建了一個(gè)sound.py文件然后保存在d:\coding\yaohao目錄下,然后導(dǎo)入同目錄下的pycat,如果你的python文件和pycat不在同一目錄,是無(wú)法導(dǎo)入pycat的
轉(zhuǎn)載于:https://www.cnblogs.com/asworm/p/7045486.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的让小乌龟可以唱歌——对Python turtle进行拓展的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: TFboy养成记 多层感知器 MLP
- 下一篇: Java:异常体系