Обобщить пример списка изображений KivyMD

#kivy #kivy-language #kivymd

#kivy #kivy-язык #kivymd

Вопрос:

https://kivymd.readthedocs.io/en/latest/components/image-list/#smarttilewithstar

Как вы обобщаете пример списка изображений kiymd doc, чтобы логика отображения изображения находилась за пределами файла kv?

Это моя попытка, но она отображает все изображения только в верхнем ряду (а также оставляет первое изображение слева пустым). Спасибо.

 from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.uix.imagelist import SmartTile
from kivymd.uix.gridlayout import MDGridLayout

img = ["00.jpg", "03.jpg", "13.jpg", "15.jpg", "24.jpg", "28.jpg", "29.jpg", "33.jpg", "34.jpg"]

Builder.load_string('''

<MyTile@SmartTile>
    size_hint_y: None
    height: "240dp"

<CatScreen>:
    
    ScrollView:
        id: scroll

        MDGridLayout:
            id: grid
            cols: 3
            adaptive_height: True
            padding: dp(4), dp(4)
            spacing: dp(4)

            MyTile:
''')


class CatScreen(Screen):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
    
    def display_image(self):
        for im in img:
            self.ids.grid.add_widget(SmartTile(source = im))
        return self


class CatApp(MDApp):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
    
    def build(self):
        self.cs = CatScreen()
        return self.cs.display_image()

CatApp().run()
  

Ответ №1:

 import os

from kivy.factory import Factory as F
from kivy.lang import Builder
from kivymd.app import MDApp
from kivy.uix.screenmanager import Screen
from kivymd.uix.imagelist import SmartTile

######################################
# this part of the code is to take images from my folder
img = []
PATH = "/root/Pictures" # source folder
for i in os.listdir(PATH):
    if ".png" in i:
        img.append(PATH   "/"   i)
######################################

Builder.load_string('''

<MyTile@SmartTile>:
    size_hint_y: None
    height: "240dp"

<CatScreen>:
    
    ScrollView:
        id: scroll

        MDGridLayout:
            id: grid
            cols: 3
            adaptive_height: True
            padding: dp(4), dp(4)
            spacing: dp(4)

            MyTile:
''')


class CatScreen(Screen):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
    
    def display_image(self):
        for im in img:
            self.ids.grid.add_widget(F.MyTile(source=im))
        return self


class CatApp(MDApp):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
    
    def build(self):
        self.cs = CatScreen()
        return self.cs.display_image()

CatApp().run()
  

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

1. Это работает. Кстати, первое изображение (00.jpg ) отображает пустое, но не является пустым изображением. 9-е изображение (34.jpg ) появляется в 4-м ряду вместо 3-го, что означает, что откуда-то появляется первое пустое изображение.

2. Удаление строки «MyTile:» устраняет пустое изображение.

Ответ №2:

Вы можете сделать это, добавив функцию..

row_default_height: 500

 # Telegram : @DIBIBl , @TDTDI ,@ruks3
#  by ruks ,muntazir
# YouTube : https://youtube.com/channel/UCUNbzQRjfAXGCKI1LY72DTA
# Instagram : https://instagram.com/_v_go?utm_medium=copy_link
# github : https://github.com/muntazir-halim
# ---------------------

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.uix.imagelist import SmartTile
from kivymd.uix.gridlayout import MDGridLayout


img = ["00.jpg", "03.jpg", "13.jpg", "15.jpg", "24.jpg", "28.jpg", "29.jpg", "33.jpg", "34.jpg"]


Builder.load_string('''

<MyTile@SmartTile>
    size_hint_y: None
    height: "240dp"

<CatScreen>:
    
    ScrollView:
        id: scroll

        MDGridLayout:            
            id: grid
            padding: 30, 30
            size_hint_y: None
            height: self.minimum_height
            adaptive_height: True
            row_default_height: 500
            
            cols: 3
            adaptive_height: True
            padding: dp(4), dp(4)
            spacing: dp(4)

            
''')


class CatScreen(Screen):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
    
    def display_image(self):
        for im in img:
            self.ids.grid.add_widget(SmartTile(source = im))
        return self


class CatApp(MDApp):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
    
    def build(self):
        self.cs = CatScreen()
        return self.cs.display_image()

CatApp().run()