在Scratch中,小猫是可以唱歌的,而且Scratch的声音木块有着丰富的功能,在这方面Python turtle略有欠缺,今天我们就来完善一下.

Python声音模块

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

Python turtle的代码结构

最近一直在阅读python turtle的源代码对于Python源代码的结构有所了解,针对造型的操作也重新定义了一些函数来与scratch的积木块相对应。

在Python turtle基础上进行扩充而不是使用Pygame、Pyglet等复杂的库是因为Python turtle本身为了教小孩子编程设计的,在结构上更加符合小孩子的学习习惯,对交互式编程友好,而pygame和pyglet不具备这两个特点。

class RawTurtle(TPen, TNavigator):# 小乌龟的动画部分# 为何添加的函数不工作呢"""Animation part of the RawTurtle.Puts RawTurtle upon a TurtleScreen and provides tools forits animation."""

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

上面两组功能是否很相似呢。

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

让我们开工把

实现TSound类

Scratch积木块对应的Python

我们一步步的来实现

对winsound模块的同学,可以访问其在官方的文档,这里介绍播放声音的方法:

winsound.PlaySound('d:\coding\maow.wav',winsound.SND_FILENAME)
# 第一个参数是文件的完整路径,第二个是播放的标志,winsound.SND_FILENAME代表的是播放的是文件

首先我们导入winsound模块之后,然后利用这个模块的PlaySound方法播放指定的声音文件这样就实现了

停止声音的办法是:

winsound.PlaySound(None, winsound.SND_PURGE)

对应的是

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

import winsound as s
s.PlaySound("d:\coding\sound.wav",s.SND_FILENAME)
print('Playing ended!')

如果这五分钟的音频sound.wav没有播放完毕,程序啥也不能干,尬不尬.

这个积木块比较霸道,要求必须等他做完了才可以,本来就相当于你跟你女朋友打电话,一般我是边打电话边做事情,但是女朋友呢非得要求你啥也不能做,直到电话打完,不然就是不尊重她,不爱她,真尬.当然了少年们,跟女朋友打电话的时候一定不要做别的事情哦.

如何实现异步播放声音呢,毕竟我们是热爱时间的好少年.


这里要用到的是同步标志winsound.SND_ASYNC


虽然同样是5分钟的音频,可是后面的语句很明显的执行了.

实现TSound类

import winsound as snd
# 导入声音类class TSound(object):"""Sounding part of the RawTurtleImplements sounding methods"""def __init__(self, soundfile, resizemode=_CFG["resizemode"]):# 其实Sound并不涉及画笔的移动和绘制,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)

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

让RawTurtle继承TSound类

class RawTurtle(TPen, TNavigator, TSound):# 小乌龟的动画部分# 为何添加的函数不工作呢"""Animation part of the RawTurtle.Puts RawTurtle upon a TurtleScreen and provides tools forits animation."""

TSound的方法添加到Turtle的函数列表

我把修改后的文件重命名为pycat,然后导入:


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

转载于:https://www.cnblogs.com/asworm/p/7045486.html

让小乌龟可以唱歌——对Python turtle进行拓展相关推荐

  1. pythonturtle简单绘图_10分钟轻松学会 Python turtle 绘图

    10分钟轻松学会 Python turtle 绘图 python2.6版本中后引入的一个简单的绘图工具,叫做海龟绘图(Turtle Graphics),turtle库是python的内部库,使用导入即 ...

  2. python中turtle怎么确定坐标_关于Python turtle库使用时坐标的确定方法

    关于Python turtle库使用时坐标的确定方法 想画一个比较复杂的图像,而且还想用turtle画,最让人想退却的是无规律的笔势和繁多的坐标,但既然没有按奈住冲动的心,那我告诉你一个比较笨的方法吧 ...

  3. python turtle画滑稽表情_python使用turtle库绘制奥运五环

    python使用turtle库绘制奥运五环 Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令 ...

  4. 十分钟轻松学会python-10分钟轻松学会python turtle绘图

    python2.6版本中后引入的一个简单的绘图工具,叫做海龟绘图(Turtle Graphics),turtle库是python的内部库,使用导入即可 import turtle 先说明一下turtl ...

  5. python turtle用法,python中turtle用法

    50)#程序启动窗口的大小和位置(从左上角的位 置),该窗口的左上角为屏幕的左上角 pythonsize=30 turtle.pensize(pythonsize)#程序中绘制图片的宽度 turtle ...

  6. 用Python Turtle库画一个萌化的蜘蛛侠

    你是从什么时候开始喜欢上漫威电影的?美国队长,钢铁侠,雷神? 我先入坑的是因为看了蜘蛛侠,小时候看完就幻想着什么时候自己也能成为一个英雄,我觉得第一代蜘蛛侠刻画得是最好的,也是给我印象最深刻的一代蜘蛛 ...

  7. python turtle库画图案-python之绘制图形库turtle(转)

    关于绘制图形库turtle#画布上,默认有一个坐标原点为画布中心的坐标轴(0,0),默认"standard"模式坐标原点上有一只面朝x轴正方向小乌龟一:海龟箭头Turtle相关方法 ...

  8. python turtle循环图案-有趣的Python turtle绘图

    原标题:有趣的Python turtle绘图 Python Turtle是Python的一个编程教育类库,越来越受到教育者的关注,近日,以"智能时代,逐梦成长"为主题的第5届全国青 ...

  9. python turtle画熊-Python turtle画图库画姓名实例

    *****看一下我定义的change()和run()函数****** 绘图坐标体系: 作用:设置主窗体的大小和位置 ? 1 turtle.setup(width, height, startx, st ...

最新文章

  1. 各种排序实现以及稳定性分析
  2. 使用 soapUI 测试 REST 服务
  3. AtCoder - 2153 An Ordinary Game list模拟 || 博弈
  4. java操作Excel之POI(3)
  5. Hadoop 中RPC使用
  6. systrace html空白,Android性能优化之Systrace工具介绍(一) _ Systrace生成的trace.html打开空白或者打不开的解决办法...
  7. 数据中台是下一代大数据_全栈数据科学:下一代数据科学家群体
  8. FreeSql (二十七)将已写好的 SQL 语句,与实体类映射进行二次查询
  9. Spring Boot快速搭建Web开发框架(Hibernate+Thymeleaf)
  10. 搭建Nginx+PHP环境
  11. Linux查看文件第几行到第几行命令
  12. 【机器学习】萌新必学的 Top10 算法
  13. tomcat 8安装 linux,linux下tomcat8安装详解(附图解步骤)
  14. Android图像办理组件
  15. 我的新书《Android App开发从入门到精通》终于出版啦
  16. wacom数位板怎么调压感_数位板没有压感怎么办?如何设置?
  17. photoshop插画插件_照片快速转矢量插画PS动作插件 Vector Art Photoshop Action
  18. Stata:投资组合有效边界
  19. 2021-2027全球与中国B2C视频直播平台市场现状及未来发展趋势
  20. [【震撼】珠海中学曝【师生课堂互殴门】]

热门文章

  1. 一个失败的操作系统MULTICS
  2. 差点吓尿,手贱不要乱点support native debug
  3. 《失业的程序员》(六):加班
  4. error LNK2019: 无法解析的外部符号 __imp__inet_ntoa@4
  5. 关于Ping命令的问题
  6. 黄聪:在C#中如何使用资源中的图片
  7. 过去可忆,未来可期(随心录+杂记)
  8. EF-DbUpdateException解决方案
  9. windows7环境下使用pip安装MySQLdb
  10. mysql 5.7报1055错误的解决方法