我正在使用kivy制作一个小型音乐播放器,但我遇到了一些问题。我正在使用一个屏幕管理器,它将用户引导到他的库或整个轨道列表。当选择其中一个时,我想找到并加载所有标题作为按钮,按下时播放。这是基本的轨道课程:
class Track(Button):
path = 'C:/Users/...../tracks/'
def __init__(self,title,**kwargs):
self.title = title
super(Track,self).__init__(text=self.title,**kwargs)
def playTrack(self):
self.sound = SoundLoader.load(self.path+self.title)
self.sound.play()
这里还有一个音乐类,可以找到目录中的所有曲目并将它们添加到列表中:
class mymusic():
path = 'C:/Users/...../tracks'
def __init__(self,**kwargs):
self.tracks=os.listdir(self.path)
print self.tracks
def loadTracks(self):
trackslist = []
for i in self.tracks:
trackslist.append(Track(i))
return trackslist
最后,这是我使用的代码,应该创建按钮(下面的sm是屏幕管理器,根,库和音乐是屏幕的子类):
f = lambda obj: obj.playTrack()
Music = music(name='Music')
layout = BoxLayout()
Music.add_widget(layout)
sm.add_widget(root(name='Root'))
sm.add_widget(libraries(name='My libaries'))
sm.add_widget(Music)
musicobj = mymusic()
tracklist = musicobj.loadTracks()
for i in tracklist:
print i
i.bind(on_press=f(i))
这不起作用。通过运行它我得到以下错误:
Traceback (most recent call last):
File "C:\Users\Vlassis\Desktop\test.py", line 108, in <module>
i.bind(on_press=f(i))
File "kivy\_event.pyx", line 430, in kivy._event.EventDispatcher.bind (kivy\_event.c:5903)
AssertionError: None is not callable
目录中的最后一首曲目也会在后台播放。我无法弄清楚原因。代码背后的逻辑是否正确?我该怎么做呢?提前谢谢。