玩坏了,用 Python 制作 GUI 钢琴~

2022年7月26日 340点热度 0人点赞 0条评论

前一段时间刷b站,看到一些up主制作的Matlab钢琴很火,很好玩的样子

图片

作为 Python 区技术博主,第一想法当然是能否用 Python 也做一个,既好玩也能用于教学,经过一番研究总算折腾出来一个简易版?

早起Python

,赞 165

本文就分享一下思路与代码。

实现思路

在写代码之前,还是先整理下思路,用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)

其余部分的代码就都是重复且枯燥的复制粘贴播放音乐,此处不再解释,最终效果如下
图片

56940玩坏了,用 Python 制作 GUI 钢琴~

这个人很懒,什么都没留下

文章评论