您的位置:首页 > 编程语言 > Python开发

PYTHON实现简易电子钢琴,tk库的简单实用

2019-04-26 08:42 441 查看

目的:想要实现输入特定的格式“1A1/2B2/2C2”,输出相应的音乐。

音乐频率数组:order =[[131,147,165,175,196,220,247],[262,296,330,349,392,440,494],[523,587,659,698,784,880,988],[1047,1175,1319,1397,1568,1760,1976]],第一行到第四行分别对应A,B,C,D,第一列到第七列,分别对应到7。如第二行第四列,即为B4

还要写图形界面,其实很简单。只要加载tk库,再加一个button,让识别并播放的功能作为button的函数就行了。

下边是完整代码:
import winsound
from tkinter import *
def doone():
for i in range(1,11):
i=i*500
winsound.Beep(i,500)
def submit():#读取乐谱并播放的函数
music = list(map(str,u.get())) # print(music) print(p.get())
order =[[131,147,165,175,196,220,247],[262,296,330,349,392,440,494],[523,587,659,698,784,880,988],[1047,1175,1319,1397,1568,1760,1976]]
match =[‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’]
char =[ ‘A’,‘B’,‘C’,‘D’]
n = 1
j=0
k=0
m=0
time1 = [0 for x in range(10,1000)]
order1 = [0 for x in range(0,1000)]
order11 = [0 for x in range(0,1000)]
orderm = [0 for x in range(0,1000)]
for i in range(len(music)):
if music[i] == ‘/’:
n=n+1
if i==0:
if music[i] == ‘0’ and music[i+1] == ‘.’ and music[i+2] == ‘5’:
time1[j]=0.5
j=j+1
t=0
while t<10:
if music[i] == match[t] and music[i+3] == ‘/’:
time1[j]=t
j=j+1
t=t+1
else:
if music[i] == ‘0’ :
time1[j]=0.5
j=j+1
for tp in range(1,9):
if (music[i] == match[tp] and music[i-1] == ‘/’ ):
time1[j]=tp
j=j+1
for tn in range(0,4):
if music[i] == char[tn] :
order1[m]=tn
m=m+1
for tt in range(1,9):
if music[i] == match[tt] and ( music[i-1] == ‘A’ or music[i-1] == ‘B’ or music[i-1] == ‘C’ or music[i-1] == ‘D’) :
order11[k]=tt
k=k+1
print(n)
l=0
while l< n:
time1[l]=time1[l]*int(p.get())
orderm[l]=order[order1[l]][order11[l]-1]
time1[l]=int(time1[l])# print(“时间,字母,顺序,音律以此为:”) print(time1[l], order1[l], order11[l],orderm[l])
l=l+1
l=0
while l <n:# print(orderm[l],time1[l])
winsound.Beep(orderm[l],time1[l])
l=l+1
#图形界面
root = Tk()
root.title(“电子钢琴简易版”)
frame = Frame(root)
frame.pack(padx=8, pady=8, ipadx=4)
lab1 = Label(frame, text=“请输入乐谱:”)
lab1.grid(row=0, column=0, padx=5, pady=5, sticky=W)
#u = StringVar()
#ent1 = Entry(frame, textvariable=u)
#ent1.grid(row=0, column=1, sticky=‘ew’, columnspan=2)
lab2 = Label(frame, text=“请输入每个音节代表的时间(单位ms):”)
lab2.grid(row=1, column=0, padx=5, pady=5, sticky=W)
p = StringVar()
ent2 = Entry(frame, textvariable=p)
ent2.grid(row=1, column=1, sticky=‘ew’, columnspan=2)
button = Button(frame, text=“确认”, command=submit, default=‘active’)
button.grid(row=2, column=1)
button2 = Button(frame, text=“退出”, command=quit)
button2.grid(row=2, column=2, padx=5, pady=5)
button3 = Button(frame, text=“第一题播放”,command=doone)
button3.grid(row=2, column=0)
root.mainloop()

doone是一个可以播放从低频到高频的固定时间间隔的函数,很简单的,一看就明白。

tk库的简单实用,在这个题里体现的很明显了。最常用的button,label组件,都在这段代码里应用到了

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: