我刚刚开始学习Kivy,并且我对事物如何间隔存在疑问。我正在尝试从磁盘加载图像,然后以网格方式呈现它们。
但是,图像全部被压缩到左下角。
#:kivy 1.11.0
<Gallery>:
ScrollView:
GridLayout:
id: wall
cols: 4
size_hint_y: None
height: self.minimum_height
<Root>:
gallery: gallery_id
BoxLayout:
orientation: 'vertical'
size: root.size
ActionBar:
ActionView:
ActionPrevious:
ActionButton:
text: "Button"
on_release: root.clickme()
Gallery:
id: gallery_id
from kivy.app import App
from kivy.core.window import Window
from kivy.uix.widget import Widget
from kivy.uix.image import AsyncImage
from kivy.properties import (
NumericProperty, ReferenceListProperty, ObjectProperty
)
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
import glob
class Gallery(Widget):
def doload(self):
pngs = glob.glob('/Users/me/Desktop/*.png')[:150]
for p in pngs:
bl = BoxLayout(orientation='vertical')
label = Label(text='MyLabel')
image = AsyncImage(source=p, size_hint=(1, None), keep_ratio=True, allow_stretch=True)
bl.add_widget(image)
bl.add_widget(label)
self.ids.wall.add_widget(bl)
class Root(Widget):
gallery = ObjectProperty(None)
def clickme(self):
print("i've been clicked")
def update(self):
self.gallery.doload()
pass
class MyApp(App):
def build(self):
root = Root()
root.update()
return root
if __name__ == '__main__':
Window.size = (800, 600)
MyApp().run()
这是它的样子(您可以看到图像被压缩,左下角): Screenshot
如何正确排列这些图像?像这样的东西:Diagram
作为奖励,是否有一种方法可以在用户调整窗口大小时动态确定cols
中的GridLayout
属性?例如,如果用户增加窗口的宽度,则该应用应支持更大的col
大小。同样,如果用户缩小窗口,则应用程序应减小col
的大小。
答案 0 :(得分:0)
<Gallery>:
ScrollView:
GridLayout:
id: wall
cols: 4
size_hint_y: None
height: self.minimum_height
图库是Widget的子类,因此无需特别努力调整其子项的大小或位置,因此ScrollView的默认大小为(100,100),位置为(0,0),因此放置了GridLayout在同一区域内,因此您的所有图像都放在该小区域内。
解决方案是使Gallery成为适当的布局类型,例如BoxLayout。
作为奖励,是否有一种方法可以在用户调整窗口大小时动态确定GridLayout中的cols属性?
在kv中:cols: some_function_of(Window.size)
。