将函数绑定到循环中的按钮时出错

时间:2016-02-21 20:33:55

标签: python kivy

我正在使用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

目录中的最后一首曲目也会在后台播放。我无法弄清楚原因。代码背后的逻辑是否正确?我该怎么做呢?提前谢谢。

0 个答案:

没有答案