Kivy- for循环生成按钮的不同属性

时间:2018-01-07 01:21:34

标签: python button kivy kivy-language

我一直在尝试根据目录中的文件数制作多个按钮。当按下每个按钮时,它应该开始启动不同的视频文件。到目前为止我有样品我可以创建4个按钮但是当我按下它时总是触发最后一个按钮on_release功能。我已经尝试了make一个按钮数组,他们会有不同的实例,但没有成功。试图获取按钮的ID,但当我尝试在另一个函数中返回widget.id时,它返回了所有4个按钮的ID。

有没有明确的方法来处理这类事情。我更喜欢使用kivy文件,但我无法弄清楚如何在for循环中创建按钮。我也可以分享完整的代码和kivy文件,但它会非常混乱。如果您需要更多信息,请告诉我。

提前致谢。

def createMultipleButton(self, dt):    
    root = Widget()
    size_y=150;
    size_x=150;

    for i in range(1):
    folderList = os.listdir(picture_path)
    if len(folderList)==0:
        time.sleep(1)
        break
    fileList = os.listdir(picture_path)
    print fileList

    for file in fileList:

            x = (picture_path+"/"+file)

            button = Button(id=str(file),text="" + str(file),size_hint=(None, None),height=size_y,width=size_x, pos_hint={'x': 0, 'y': 1},background_normal=x)
            button.bind(on_release=lambda btn:self.VideoContainer(str(file))        


            print file
            self.scrollview.content_layout.add_widget(button)


def VideoContainer(self,name):

    mylist=name.split('.')
    video = VideoPlayer(source="/home/linux/kivyFiles/kivyLogin/videoAssets/"+mylist[0]+".mp4", play=True)
    video.allow_stretch=True
    video.size=(500,500)
    video.pos=(400,400)
    self.add_widget(video)

1 个答案:

答案 0 :(得分:0)

函数体中的名称在执行函数时进行评估,而不是在声明函数时进行评估。执行lambda函数时,file值是fileList的最后一个元素(按下按钮)。

你的lambda功能应该是:

button.bind(on_release=lambda btn, f=file: self.VideoContainer(f))

但我建议使用functools.partial而不是lambda函数来传递回调参数:

from functools import partial

button.bind(on_release=partial(self.VideoContainer, file))

def VideoContainer(self, name, btn):
    #....