我添加到无限滚动视图的图像越多,它们变得越小

The more images I add to an infinite scrollview the smaller they get

我正在尝试在 kivy 中制作一个 reader 应用程序。我在滚动视图中显示图像时遇到问题。我添加的图像越多,它们变得越小。

是否有某种动态方式可以让我获取适合全屏大小的图像?

我确实有一些代码,但现在宁愿放弃它。 y 轴上的大小提示似乎有所作为,但我想看看是否有更好的方法。

import os
from kivy.app import App
from kivy.uix.image import AsyncImage
from kivy.uix.gridlayout import GridLayout
from kivy.core.window import Window
from kivy.uix.scrollview import ScrollView
from PIL import Image as Image1
path = 'F:\manga\A Strange Life\1\'
Window.clearcolor = (1,1,1,1)
Window.size = (1000, 200)
class MainApp(App):
    def images_size(self,img_size, **kwargs):
        width, height = Window.size
        return width, (img_size[0] * height / width)
    def build(self):
        root = ScrollView(size=(Window.width,Window.height))
        layout = GridLayout(cols=1,size_hint=(1,None),height=self.minimum_height)
        for i in range(1,len(os.listdir(path))+1):
            img_size = Image1.open(f'{path}{str(i)}.jpg').size
            img = AsyncImage(source=f'{path}{str(i)}.jpg',nocache=True)
            layout.add_widget(img) 
        root.add_widget(layout)
        return root

MainApp().run()

第一个问题是代码:

layout = GridLayout(cols=1,size_hint=(1,None),height=self.minimum_height)

将失败,因为此时 self.minimum_height 正在尝试访问 MainAppminimum_height 属性(不存在)。使用 minimum_height 是您需要做的,但是您需要绑定代码以在 minimum_height 更改时设置 GridLayoutheight。但是,如果您使用 kivy 语言,该绑定会自动为您创建。这是执行此操作的 kv 语言字符串:

#:import Window kivy.core.window.Window
ScrollView:
    size_hint: None, None
    size: Window.size
    GridLayout:
        id: grid
        cols: 1
        size_hint: 1, None
        height: self.minimum_height

然后您可以通过 grid id 访问它,将 Images 添加到 GridLayout。这是执行上述所有操作的代码的修改版本:

import os
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.image import AsyncImage
from kivy.core.window import Window
from PIL import Image as Image1
path = 'F:\manga\A Strange Life\1\'
Window.clearcolor = (1,1,1,1)
Window.size = (1000, 200)

kv = '''
#:import Window kivy.core.window.Window
ScrollView:
    size_hint: None, None
    size: Window.size
    GridLayout:
        id: grid
        cols: 1
        size_hint: 1, None
        height: self.minimum_height
'''
class MainApp(App):
    def images_size(self,img_size, **kwargs):
        width, height = Window.size
        return width, (img_size[0] * height / width)
    def build(self):
        root = Builder.load_string(kv)
        layout = root.ids.grid
        for i in range(1,len(os.listdir(path))+1):
            img_size = Image1.open(f'{path}{str(i)}.jpg').size
            img = AsyncImage(source=f'{path}{str(i)}.jpg',nocache=True, size_hint=(None, None), size=img_size)
            layout.add_widget(img)
        return root

MainApp().run()