lambda функция не работает в цикле


from kivymd.app import MDApp
from kivymd.uix.list import OneLineListItem
import os
KV = '''
ScrollView:

    MDList:
        id: container
'''


class Test(MDApp):
    def build(self):
        return Builder.load_string(KV)

    def on_start(self):
        for i in os.listdir(path='.'):
            self.root.ids.container.add_widget(
                OneLineListItem(text=i,on_release=lambda i:print(i))
            )

Этот код должен отображать все папки и файлы в папке с py файлом. При нажатии на одну из кнопок в списке, функция print должна выводить текст с этой кнопки(i).

Если использовать lambda i:..., то она вернёт None, если i не передавать (lambda a:), то будет выводиться только последний элемент.


Ответы (1 шт):

Автор решения: gil9red

В on_release первым параметром передавался объект самого элемента, поэтому i=i нужно указывать вторым параметром

Попробуйте:

import os

from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.list import OneLineListItem


KV = '''
ScrollView:

    MDList:
        id: container
'''


class Test(MDApp):
    def build(self):
        return Builder.load_string(KV)

    def on_start(self):
        for i in os.listdir(path='.'):
            self.root.ids.container.add_widget(
                OneLineListItem(text=i, on_release=lambda item, i=i: print(i))
            )


Test().run()
→ Ссылка