我试图制作一个音乐播放器,允许将一首歌放入shell中然后播放,我在class Notes():
和import winsound
import time
length = 125
class Notes():
def processNote(note):
if(note == 'C'):return Notes.processNote(262)
if(note == 'D'):return Notes.processNote(294)
if(note == 'D5'):return Notes.processNote(587)
if(note == 'A'):return Notes.processNote(440)
if(note == 'Ab'):return Notes.processNote(415)
if(note == 'G'):return Notes.processNote(392)
if(note == 'F'):return Notes.processNote(349)
if(note == 'B'):return Notes.processNote(247)
if(note == 'Bb'):return Notes.processNote(233)
song = "CCCCCCCCCCCD"
noteList = list(song)
print(noteList)
for note in noteList:
print("Doing ", note)
frequency = Notes.processNote(note)
winsound.Beep(frequency, length)
中遇到类型错误的问题无法弄清楚原因。
Traceback (most recent call last):
File "C:\Python\Tester.py", line 27, in <module>
winsound.Beep(frequency, length)
TypeError: an integer is required (got type NoneType)
错误:
{{1}}
答案 0 :(得分:1)
如果我可以说些什么,而不是
class Notes():
def processNote(note):
if(note == 'C'):return Notes.processNote(262)
if(note == 'D'):return Notes.processNote(294)
if(note == 'D5'):return Notes.processNote(587)
(thousands IFs)
你可以使用python字典并创建映射:
class Notes():
def processNote(note):
signature_to_freq = {'C': 262, 'D': 294, 'D5': 587,
'B': 247}
return signature_to_freq[note]
答案 1 :(得分:0)
目前,函数processNote()
为任何有效输入返回None
,因为您调用它两次而不是仅返回值。查看代码的处理方式可能会有所帮助,以了解发生这种情况的原因:
想象一下,使用音符值processNote()
调用"C"
。这将与第一个if
语句匹配,它将返回调用processNote()
的值为262 的结果。由于在processNote()
函数中没有if语句捕获262,因此返回None
(因为这是Python函数的默认值),因此frequency
变量最终为{{1} }。
您可以通过返回文字值来简单地解决这个问题:
None