首页 > Python资料 博客日记
Python 一步一步教你用pyglet制作可播放音乐的扬声器类
2024-03-10 19:00:07Python资料围观166次
目录
扬声器类
1. 绘制喇叭
本篇将教你用pyglet画一个小喇叭,如上图。这里要用到pyglety库shapes模块中的圆弧Arc和多边形Pylygon画出这个扬声器的图片:
Arc(x, y, radius, segments=None, angle=6.283185307179586, start_angle=0, closed=False, color=(255, 255, 255, 255), batch=None, group=None)
x,y 是圆弧的圆心坐标;radius 是半径;
angle是圆心角的弧度数;
start_angle是圆弧起始的弧度数,以水平线起始时,值为0;
圆弧控件没有表示粗细的参数,只能多画几个同心圆弧来加粗。
Polygon(*coordinates, color=(255, 255, 255, 255), batch=None, group=None)
coordinates是多边形的各个端点的坐标列表,也可以写成元组方式;
多边形控件是填充形状,没有粗细参数也不能只画边线。
代码如下:
import pyglet
window = pyglet.window.Window(800,500)
batch = pyglet.graphics.Batch()
color = (255, 255, 255)
pi = 3.141592653589793
arc = []
x, y = 380, 250
for i in [*range(6),*range(18,24),*range(36,42)]:
arc.append(pyglet.shapes.Arc(x=x, y=y, radius=50-i/2, angle=pi/2, start_angle=-pi/4, color=color, batch=batch))
coordinates = [x+10, y+8], [x, y+8], [x, y-8], [x+10, y-8], [x+16, y-14], [x+16, y+14]
polygon = pyglet.shapes.Polygon(*coordinates, color=color, batch=batch)
@window.event
def on_draw():
window.clear()
batch.draw()
pyglet.app.run()
2. 扬声器类
改写为一个类便于调用,可以画在任意坐标处:
class Speaker:
def __init__(self, x, y, color=(255, 255, 255)):
self.arc = []
pi = 3.141592653589793
for i in [*range(6),*range(18,24),*range(36,42)]:
self.arc.append(pyglet.shapes.Arc(x=x, y=y, radius=50-i/2, angle=pi/2, start_angle=-pi/4, color=color, batch=batch))
coordinates = [x+10, y+8], [x, y+8], [x, y-8], [x+10, y-8], [x+16, y-14], [x+16, y+14]
self.polygon = pyglet.shapes.Polygon(*coordinates, color=color, batch=batch)
调用代码:
import pyglet
window = pyglet.window.Window(800,500)
batch = pyglet.graphics.Batch()
class Speaker:
def __init__(self, x, y, color=(255, 255, 255)):
self.arc = []
pi = 3.141592653589793
for i in [*range(6),*range(18,24),*range(36,42)]:
self.arc.append(pyglet.shapes.Arc(x=x, y=y, radius=50-i/2, angle=pi/2, start_angle=-pi/4, color=color, batch=batch))
coordinates = [x+10, y+8], [x, y+8], [x, y-8], [x+10, y-8], [x+16, y-14], [x+16, y+14]
self.polygon = pyglet.shapes.Polygon(*coordinates, color=color, batch=batch)
@window.event
def on_draw():
window.clear()
batch.draw()
speaker1 = Speaker(380, 250)
speaker2 = Speaker(600, 360)
pyglet.app.run()
运行效果:
3. 禁音状态
再加两条红色直线表示禁音状态,shapes.Line用法:
Line(x, y, x2, y2, width=1, color=(255, 255, 255, 255), batch=None, group=None)
x,y, x2,y2 为直线两端点的坐标;
width为直线粗细,缺省默认值为1,直线控件有粗细的。
代码如下:
import pyglet
window = pyglet.window.Window(800,500)
batch = pyglet.graphics.Batch()
class Speaker:
def __init__(self, x, y, color=(255, 255, 255)):
self.arc = []
pi = 3.141592653589793
for i in [*range(6),*range(18,24),*range(36,42)]:
self.arc.append(pyglet.shapes.Arc(x=x, y=y, radius=50-i/2, angle=pi/2, start_angle=-pi/4, color=color, batch=batch))
coordinates = [x+10, y+8], [x, y+8], [x, y-8], [x+10, y-8], [x+16, y-14], [x+16, y+14]
self.polygon = pyglet.shapes.Polygon(*coordinates, color=color, batch=batch)
self.line1 = pyglet.shapes.Line(x, y-24, x+48, y+24, width=3, color=(255, 0, 0), batch=batch)
self.line2 = pyglet.shapes.Line(x, y+24, x+48, y-24, width=3, color=(255, 0, 0), batch=batch)
@window.event
def on_draw():
window.clear()
batch.draw()
speaker1 = Speaker(380, 250)
speaker2 = Speaker(600, 360)
pyglet.app.run()
运行效果:
4. 设置状态
再为Speaker类增加两个属性和一个方法,用于设置状态:
self.line1.visible = Flase
self.line2.visible = Flasedef enabled(self, enabled=True):
self.line1.visible = self.line2.visible = not enabled
调用代码:
import pyglet
window = pyglet.window.Window(800,500)
batch = pyglet.graphics.Batch()
class Speaker:
def __init__(self, x, y, color=(255, 255, 255)):
self.arc = []
pi = 3.141592653589793
for i in [*range(6),*range(18,24),*range(36,42)]:
self.arc.append(pyglet.shapes.Arc(x=x, y=y, radius=50-i/2, angle=pi/2, start_angle=-pi/4, color=color, batch=batch))
coordinates = [x+10, y+8], [x, y+8], [x, y-8], [x+10, y-8], [x+16, y-14], [x+16, y+14]
self.polygon = pyglet.shapes.Polygon(*coordinates, color=color, batch=batch)
self.line1 = pyglet.shapes.Line(x, y-24, x+48, y+24, width=3, color=(255, 0, 0), batch=batch)
self.line2 = pyglet.shapes.Line(x, y+24, x+48, y-24, width=3, color=(255, 0, 0), batch=batch)
self.line1.visible = self.line2.visible = False
def set_enabled(self, enabled=True):
self.line1.visible = self.line2.visible = not enabled
@window.event
def on_draw():
window.clear()
batch.draw()
speaker1 = Speaker(380, 250)
speaker2 = Speaker(600, 360)
speaker2.set_enabled(False)
pyglet.app.run()
运行效果:
5. 切换状态
继续增加鼠标点击切换状态的功能,增加属性和方法:
属性:
self.x = x
self.y = y
self.enabled = True方法:
def set_enabled(self, enabled=True):
self.enabled = enabled
self.line1.visible = self.line2.visible = not enabled
def on_mouse_over(self, x, y):
return self.x <= x <= self.x+50 and self.y-35 <= y <= self.y+35
增加鼠标点击事件:
@window.event
def on_mouse_press(x, y, button, modifier):
if speaker1.on_mouse_over(x,y):
speaker1.enabled = not speaker1.enabled
speaker1.set_enabled(speaker1.enabled)
if speaker2.on_mouse_over(x,y):
speaker2.enabled = not speaker2.enabled
speaker2.set_enabled(speaker2.enabled)
运行效果:分别点击两个图标,就能各自切换状态
6. 播放音乐
使用 media 模块调入mp3音乐,配合Speaker类播放
media = pyglet.media.load('voice1.mp3')
sound = pyglet.media.Player()
sound.queue(media)
sound.loop = True
sound.play()
鼠标事件中增加音乐播放和暂停的代码:
@window.event
def on_mouse_press(x, y, button, modifier):
if speaker.on_mouse_over(x,y):
speaker.enabled = not speaker.enabled
speaker.set_enabled(speaker.enabled)
if speaker.enabled:
sound.play()
else:
sound.pause()
完整代码:
import pyglet
window = pyglet.window.Window(800,500)
batch = pyglet.graphics.Batch()
class Speaker:
def __init__(self, x, y, color=(255, 255, 255)):
self.arc = []
pi = 3.141592653589793
for i in [*range(6),*range(18,24),*range(36,42)]:
self.arc.append(pyglet.shapes.Arc(x=x, y=y, radius=50-i/2, angle=pi/2, start_angle=-pi/4, color=color, batch=batch))
coordinates = [x+10, y+8], [x, y+8], [x, y-8], [x+10, y-8], [x+16, y-14], [x+16, y+14]
self.polygon = pyglet.shapes.Polygon(*coordinates, color=color, batch=batch)
self.line1 = pyglet.shapes.Line(x, y-24, x+48, y+24, width=3, color=(255, 0, 0), batch=batch)
self.line2 = pyglet.shapes.Line(x, y+24, x+48, y-24, width=3, color=(255, 0, 0), batch=batch)
self.line1.visible = self.line2.visible = False
self.x = x
self.y = y
self.enabled = True
def set_enabled(self, enabled=True):
self.enabled = enabled
self.line1.visible = self.line2.visible = not enabled
def on_mouse_over(self, x, y):
return self.x <= x <= self.x+50 and self.y-35 <= y <= self.y+35
@window.event
def on_draw():
window.clear()
batch.draw()
@window.event
def on_mouse_press(x, y, button, modifier):
if speaker.on_mouse_over(x,y):
speaker.enabled = not speaker.enabled
speaker.set_enabled(speaker.enabled)
if speaker.enabled:
sound.play()
else:
sound.pause()
speaker = Speaker(720, 450)
media = pyglet.media.load('voice1.mp3')
sound = pyglet.media.Player()
sound.queue(media)
sound.loop = True
sound.play()
pyglet.app.run()
运行代码后,就能播放音乐了,点击扬声器图标可以切换音乐的播放和暂停状态。
完
标签:
上一篇:Python|合并两个字典的8种方法
下一篇:自定义事件提醒程序
相关文章
最新发布
- 光流法结合深度学习神经网络的原理及应用(完整代码都有Python opencv)
- Python 图像处理进阶:特征提取与图像分类
- 大数据可视化分析-基于python的电影数据分析及可视化系统_9532dr50
- 【Python】入门(运算、输出、数据类型)
- 【Python】第一弹---解锁编程新世界:深入理解计算机基础与Python入门指南
- 华为OD机试E卷 --第k个排列 --24年OD统一考试(Java & JS & Python & C & C++)
- Python已安装包在import时报错未找到的解决方法
- 【Python】自动化神器PyAutoGUI —告别手动操作,一键模拟鼠标键盘,玩转微信及各种软件自动化
- Pycharm连接SQL Sever(详细教程)
- Python编程练习题及解析(49题)
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Anaconda版本和Python版本对应关系(持续更新...)
- Python与PyTorch的版本对应
- Windows上安装 Python 环境并配置环境变量 (超详细教程)
- Python pyinstaller打包exe最完整教程