玩坏了,用 Python 制作 GUI 钢琴~
共 1992字,需浏览 4分钟
·
2022-03-04 14:32
↑ 关注 + 星标 ,每天学Python新技能
后台回复【大礼包】送你Python自学大礼包
前一段时间刷b站,看到一些up主制作的Matlab
钢琴很火,很好玩的样子
作为 Python 区技术博主,第一想法当然是能否用 Python 也做一个,既好玩也能用于教学,经过一番研究总算折腾出来一个简易版👇
本文就分享一下思路与代码。
实现思路
在写代码之前,还是先整理下思路,用Python
实现的话,只需要创建界面与按钮,并给每个按钮绑定播放音阶的函数即可,这样简单的功能肯定用不着PyQt
这样的大家伙,tkinter
就能完美实现。
下面的问题就转到如何使用Python
播放音频文件,首先搜了下,了解到playsound
库
from playsound import playsound
playsound('A4.mp3')
就像上面代码展示的一样,两行代码就能播放mp3
,但也仅限于此,无法指定播放时长等功能,如果一个音阶时长8s
,必须要等上一个播放完毕才能播放下一个,这样的话输出的声音就不能连贯。
继续研究之后发现pygame
可以完美实现音频播放与简单处理,并且配合time
库可以控制播放时长,例如每个音阶只播放 1s
from pygame import mixer
pygame.mixer.music.play()
time.sleep(10)
pygame.mixer.music.stop()
但是这样的话,在两个音阶之间切换时会有一个爆音,于是可以使用fadeout(time)
进行淡出,在指定时间内音量由初始值渐变为0,最后停止播放。
但这样的话,会在两个音阶切换时有延迟,如果想要没有延迟的话就需要使用多线程来进行播放,但在tkinter
中使用多线程似乎是比较复杂的,遂切换思路,使用mixer.Sound
方法来进行播放,仍是两行代码就能播放,并且可以同时按下多个按键!
from pygame import mixer
mixer.Sound("mp3/Cs1.wav").play()
搞定了音乐播放后面就是体力活了,下面开写代码!
Python实现
首先是下载对应的全部音阶文件,随便找个钢琴网站 F12 一下就能找到,至于tkinter
的部分并没有太多,只是常规的创建标题、按钮
master.title("Python_Piano_GUI")
master.geometry("1766x460")
self.Cs1_button = Button(master,bg="black", fg='white',text="C1#", command=Cs1, height=180, width=50)
self.Cs1_button.grid(row=1, columnspan=2)
self.D1_button = Button(master, bg="white", text="D1", height=200, width=50)
self.D1_button.grid(row=5, column=1)
self.Ds1_button = Button(master, bg="black", fg="white", text="D1#", command=Ds1, height=180, width=50)
self.Ds1_button.grid(row=1, columnspan=4)
·······
需要注意的是,在mac
系统下是无法通过设置background
调整按钮的背景颜色,需要安装tkmacosx
来解决。
此外,为了让按下按钮能对应变化按钮颜色需要监听系统键盘的按下(press
)与释放(release
)
def on_key_release(event):
if event.keysym in keys:
keys[event.keysym].config(bg=btn_bg)
master.bind('<KeyPress>', play_music)
master.bind("<KeyRelease>", on_key_release)
其余部分的代码就都是重复且枯燥的复制粘贴播放音乐,此处不再解释,最终效果如下
-END-
推荐阅读
您看此文用 分 秒,转发只需1秒