当前位置:首页 > 新闻资讯 > 科技生活 > 新闻
让音乐丰富起来 ——对Python turtle进行拓展
  • 2018/10/24 11:04:34
  • 类型:原创
  • 来源:电脑报
  • 报纸编辑:电脑报
  • 作者:
【电脑报在线】 在Scratch中,小猫是可以唱歌的,而且Scratch的声音木块有着丰富的功能,在这方面Python turtle略有欠缺,今天我们就来完善一下。


了解Python声音模块

Python处理声音的模块很多,但是我们要实现的功能并不复杂,所以只需要用到winsound这个系统自带的模块就好了.我们要的只是实现类似scratch的功能,用不到很复杂的功能的,当然Python能够做的比scratch多多了.

 

 

Python源代码的结构(图1)对造型的操作也重新定义了一些函数,scratch的积木块相对应Python turtle基础上进行扩充而不是使用PygamePyglet等复杂的库是因为Python turtle本身为了教小孩子编程设计的,在结构上更加符合小孩子的学习习惯,对交互式编程友好,而pygamepyglet不具备这两个特点。

 

 

其中核心的turtle继承自RawTurtle(图2),而RawTurtle继承自TPenTNavigator,两个类分别控制画笔的绘制和移动,简单的来说TPen承载的是类似Scratch中画笔积木类的功能(图3),而TNavigator更多的承载了动作积木类的功能。

 

所以要实现Python turtle的声音功能,只要重新写一个声音相关的类,然后让RawTurtle继承这个声音类就ok,当然还要注意一个问题,turtle所有的类都要加入到_tg_turtle_functions这个列表中,这个列表保存了turtle所有的方法,用来保证在交互式命令行里,默认turtle的各种方法可以直接作为函数调用.

实现TSound类Scratch积木块对应的Python

开工,为了实现TSound,需要Scratch积木块对应的Python一步步的来实现。先导入winsound库并生命类,应用winsound模块的时候,可以访问其在官方的文档,这里介绍播放声音的方法:winsound.PlaySound('d:\coding\maow.wav',winsound.SND_FILENAME)#。第一个参数是文件的完整路径,第二个是播放的标志,winsound.SND_FILENAME代表的是播放的是文件

 

首先我们导入winsound模块然后利用这个模块的PlaySound方法播放指定的声音文件这样就实现了。播放直到完毕,停止声音的办法是:winsound.PlaySound(None, winsound.SND_PURGE)对应的是:停止所有声音模块。

 

默认的声音播放方式是同步的,也就是说播放声音的时候程序啥也不能干,如图4播放的5分钟音频:


如果这五分钟的音频sound.wav没有播放完毕,程序啥也不能干,尬不尬。这个积木块比较霸道,要求必须等它做完如何实现异步播放声音呢,毕竟我们是热爱时间的好少年

这里要用到的是同步标志winsound.SND_ASYNC(图5),虽然同样是5分钟的音频,可是后面的语句很明显的执行了

 

找到了与这三个积木块对应的winsound语句实现TSoundimage.png(图6),import winsound as snd。

 

 

首先导入winsound模块并重命名为snd(图7),然后生命TSound,定义三个函数,实现播放,播放直到和停止所有声音的功能,当然这也仅仅是个实现而已,要真的完善还是需要比较长的时间,只是给大家简单的举个例子,这个其实可以对照register_shapeshape函数来定义和完善的

TSound添加到Turtle的函数列表

 

RawTurtle继承TSound(图8),TSound的方法添加到Turtle的函数列表添加TSound的方法到turtle的函数列表然后再RawTurtle中初始化一下TSound把修改后的文件重命名为pycat,然后导入并运行。

 

注意,IDLE新建,一个sound.py文件然后保存在d:\coding\yaohao目录下导入同目录下的pycat(图9),如果你的python文件和pycat不在同一目录是无法导入pycat

最后,播放声音,停止播放声音,大功告成。

本文出自2018-10-22出版的《电脑报》2018年第41期 A.新闻周刊
(网站编辑:PCW-hjz)


我来说两句(0人参与讨论)
发表给力评论!看新闻,说两句。
匿名 ctrl+enter快捷提交
读者活动
48小时点击排行
论坛热帖