В Python 3.8, как я могу загрузить список изображений из файлов JSONStore?

#python #json #kivy #kivymd

#python #json #киви #kivymd

Вопрос:

Могу ли я спросить, как я могу соответствующим образом загрузить список изображений в MDCard из файла json? В моем json-файле есть как минимум 20 ссылок на изображения внутри.

.py

     def load_image(self):
        store = JsonStore('image.json')
        image = store['PRD'].get('td01')
        return image

    def build(self):
        store = JsonStore('image.json')
        return Builder.load_file('main1.kv')
 

.kv

 Screen:
    BoxLayout:
        orientation: 'vertical'

        Toolbar:
            title: "Testing"

        Scroll:
            TLayout:
                TLayout2:
                    Card:
                        AsyncImage:
                            source: app.load_image()

                    Card:
                        AsyncImage:
                            source: app.load_image()

                    Card:
                        AsyncImage:
                            source: app.load_image()
 

Ответ №1:

Я предполагаю, что вы можете легко получить ссылку на изображения из python, но проблема заключается в добавлении их в файл .kv. Итак, что вы можете сделать, это указать id макет, в который вы хотите добавить карточку

 Screen:
BoxLayout:
    orientation: 'vertical'

    Toolbar:
        title: "Testing"

    Scroll:
        TLayout:
            TLayout2:
                id: layout_2
 

(Я предположил layout_2 в примере) затем вы можете добавить асинхронное изображение и MDCard с помощью python.

Вот пример:

 card = MDCard(orientation='vertical', pos_hint={"center_x":0.5, "center_y":0.65}, size_hint=(0.5,0.5))
img = AsyncImage(source='link_of_image', pos_hint={"center_x":0.5, "center_y":0.5}, allow_stretch=True)
card.add_widget(img)
self.root.ids.layout_2.add_widget(card)
 

Комментарии:

1. Я. Вы должны указать size_hint = (None, None), размер = («..», «..»)

2. Еще один вопрос, который я хочу задать: если я использую цикл for для создания 20 MDCard, как я могу заставить эти 20 MDCard on_release переключаться на другой экран?

3. Да, вы можете. вы можете определить другую функцию on_release . В python вы должны использовать lambda для определения функции. Итак, вы можете сделать что-то вроде on_release: lambda x: do_this(), и если вы предоставляете какой-либо параметр do_this(), который связывается с циклом (например, i), вам нужно использовать другую переменную y в lambda, например: для i в чем-то: …. лямбда x, y =я: do_this(y)

4. Привет, могу я спросить, как создать функцию для загрузки списка изображений из файла json? Вопрос почти тот же, но похож на использование функции для списка загрузки изображения для файла kv вместо add_widget

5. Я не совсем понял ваш вопрос. Вы имеете в виду, что хотите использовать только файл kv и загружать изображения оттуда без использования кода python? Если это так, то вы можете добавить, но вам нужно создать разные виджеты в вашем kv-файле. Насколько я знаю, внутри kivy нет такой вещи, как цикл, поэтому вам придется создавать разные виджеты для каждого из них, и это просто сделает ваш код длинным. И если вы хотите создать только один виджет и использовать разные источники изображений, используя функцию или любой параметр, то да, вы тоже можете это сделать, но он заменит предыдущий. Я надеюсь, что это поможет