我用python,运动传感器和覆盆子pi构建了一组音乐楼梯,并使用一个Web应用程序让您选择想要制作哪种乐器声音。仪器的类型存储在一个MySQL数据库中,该数据库与python代码(在光束破裂时发出声音)和Web应用程序连接,该Web应用程序允许用户从数据库中选择仪器类型。
我只是想知道是否有一种方法可以从python代码中查询数据库,这意味着仅当从数据库中选择一行时,才运行特定的代码块。
例如,有人在Web应用程序上单击“鼓”。 从MySQL数据库中选择instrumentType“ Drum” Drumsound.play()应该在python代码上运行。
有什么办法可以在python上做到这一点吗?
这是针对运行python 2.7,mySQLdb5和apache2的raspberry pi 3。
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="*****",
pw="*****",
db="stairs"
)
cursor = mydb.cursor()
cursor.execute("SELECT variableValue FROM stairs WHERE variableValue =
'instrumentType'")
import RPi.GPIO as GPIO # GPIO
import pygame.mixer # To make sound
pygame.mixer.init()
''' GPIO setup '''
GPIO.setmode(GPIO.BCM) # GPIO setmode
GPIO.setwarnings(False)
'''Define steps and pins here'''
step1 = 4
'''Motion sensor setup here'''
GPIO.setup(step1, GPIO.IN, GPIO.PUD_UP)
'''Piano files here'''
C1 = pygame.mixer.Sound("piano/C1.wav")
'''Drum files here'''
drum1 = pygame.mixer.Sound("drum/C1.wav")
def play(pin):
sound = sound_pins[pin]
print("Playing note from pin %s" % pin)
sound.play()
'''Dictionary of steps and sounds'''
sound_pins = {
step1: C1,
step2: D,
step3: E,
step4: F,
step5: G,
step6: A,
step7: B,
step8: C2,
}
for pin in sound_pins:
GPIO.setup(pin, GPIO.IN, GPIO.PUD_UP)
GPIO.add_event_detect(pin, GPIO.RISING, play, 100)
答案 0 :(得分:0)
您可能考虑使用python dictionary来针对函数存储“乐器”类型。这样,您可以创建将哪种乐器播放到声音的映射。
您可能会问自己,“这听起来像我要数据库做什么?”。使用相同的pygame.mixer.Sound("SomeWavePath")
时,您可以将乐器名称与其声音文件之间的这种关系存储在数据库本身中。这样,您只需添加数据库即可扩展仪器选择。
我还建议您切换到Python 3.x,因为2.x即将终止支持(https://pythonclock.org/)。这样一来,您就可以使用新的语言功能,并获得更多的库支持。
编辑:
例如,在数据库中存储“ instrument <-> wav_path”映射。
# Query executing obtains 'wav path' from 'instrument' primary key.
choice = cur.fetchone() # "piano/C1.wav"
sound_to_play = pygame.mixer.Sound(choice)
例如,将物体附着在乐器上
C1 = pygame.mixer.Sound("piano/C1.wav")
drum1 = pygame.mixer.Sound("drum/C1.wav")
instrument_dict = {
"piano": C1,
"drum": drum1
}
# Retrieve the sound to play
choice = cur.fetchone() # From our database, get 'drum' for example
sound_to_play = instrument_dict[ choice ]
# instrument_dict[ 'drum' ] => drum1 Sound Object.
然后:
sound_to_play.play()