在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 for
its 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 RawTurtle
Implements sounding methods
"""
def __init__(self, soundfile, resizemode=_CFG["resizemode"]):
# 其实Sound并不涉及画笔的移动和绘制,resizemode不加也是可以滴
self._soundfile = soundfile def 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 for
its animation.
"""

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

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



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

让小乌龟可以唱歌——对Python turtle进行拓展的更多相关文章

  1. 从Scratch到Python——python turtle 一种比pygame更加简洁的实现

    从Scratch到Python--python turtle 一种比pygame更加简洁的实现 现在很多学校都开设了Scratch课程,学生可以利用Scratch创作丰富的作品,然而Scratch之后 ...

  2. Python turtle库详解

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

  3. python+turtle 笔记

    用Python+turtle绘制佩琪: from turtle import * def nose(x,y):#鼻子 penup()#提起笔 goto(x,y)#定位 pendown()#落笔,开始画 ...

  4. Python turtle绘制阴阳太极图代码解析

    本文详细分析如何使用Python turtle绘制阴阳太极图,先来分解这个图形,图片中有四种颜色,每条曲线上的箭头表示乌龟移动的方向,首先从中心画一个半圆(红线),以红线所示圆的直径作半径画一个校园, ...

  5. Note of Python Turtle

    Note of Python Turtle         Turtle 库函数是 Python语言中一个流行的绘图函数库.Turtle 意思是海龟,在Python中显示为一个小箭头,通过它的移动而留 ...

  6. Python turtle(介绍一)

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

  7. Python turtle库的画笔控制说明

    turtle.penup() 别名 turtle.pu() :抬起画笔海龟在飞行 turtle.pendown() 别名 turtle.pd():画笔落下,海龟在爬行 turtle.pensize(w ...

  8. Python Turtle库绘制蟒蛇

    使用Python Turtle库来绘制蟒蛇 import turtle引入了海龟绘图体系 使用setup函数,设定了一个宽650像素和高350像素的窗体,其位置左上角坐标是200,200 说明位置在距 ...

  9. Python C/C++ 拓展使用接口库(build-in) ctypes 使用手册

    Python C/C++ 拓展使用接口库(build-in) ctypes 使用手册 ctypes 是一个Python 标准库中的一个库.为了实现调用 DLL,或者共享库等C数据类型而设计.它可以把这 ...

随机推荐

  1. VS2017 异常 Editor or Editor Extension

    KE遇到的第一个问题 VS 2017 打开文件的时候, 遇到异常 检查 activity_log发现是 Editor or Editor Extension, 解决办法: 安装插件, Clear ME ...

  2. LeetCode-7-反转整数-c# 版本

    c# 版本 // 给定一个 32 位有符号整数,将整数中的数字进行反转. public class Solution { public int Reverse(int x) { / // 边界判断 / ...

  3. Nuxt 自动化部署及打包后文件自动上传七牛云

    1.安装七牛云 2.在项目根目录新建 upload.js 3.上传凭证 4.上传配置,详情参考七牛云文档 5.在 package.js中修改项目build完成执行upload文件命令 7. nuxt. ...

  4. Pocket Gems面经prepare: Diamond and Ruby

    说我有一个背包,有n个格子,一个格子可以放5个钻石,一个钻石10块钱,一个格子可以放5个ruby,一个ruby 5块钱, 一个格子可以放一个装备,一个装备25块钱. 然后给你n个钻石n个ruby n个 ...

  5. django中如何实现分页功能

    1.在html页面中导入js文件和css文件 <link rel="stylesheet" href="../../../static/css/jquery.pag ...

  6. 记一个神奇的Bug

    多年以后,当Abraham凝视着一行行新时代的代码在屏幕上川流不息的时候,他会想起2019年4月17日那个不平凡夜晚,以及在那个夜晚他发现的那个不可思议的Bug. 虽然像无数个普普通通的夜晚一样,我在 ...

  7. android 开发设计模式---观察者模式

    情景1 有一种短信服务,比如天气预报服务,一旦你订阅该服务,你只需按月付费,付完费后,每天一旦有天气信息更新,它就会及时向你发送最新的天气信息. 情景2 杂志的订阅,你只需向邮局订阅杂志,缴纳一定的费 ...

  8. 第一个Spring程序HelloWorld

    对于初学者而言,任何理论化的讲解都比不上一个简单的HelloWorld,我们在学习Spring时也不外乎用最简单的HelloWorld程序来将这个灵活而又强大的轻量级框架推送到诸位面前.想要说明的是现 ...

  9. IT题库6-同步和异步

    同步就是许多线程同时共用一个资源,一个线程在用别的线程就要等待.异步相反,可以不用等待. 同步:发送一个请求,等待返回,然后才能再发送下一个请求:异步:发送一个请求,不等待返回,随时可以再发送下一个请 ...

  10. hdu1242 DFS基础(回溯的重要性)

    题目大意:在迷宫里从a出发走到r,每走一格时间+1,但是遇到x时间还要额外+1,求最短的时间. 题解:直接dfs把每一个格子都走一遍,设置一个时间参数,走一格就+1,还要注意回溯和剪枝. 很多新手都会 ...