【问题标题】:adding dynamic widgets are not sized correctly in Kivy在 Kivy 中添加动态小部件的大小不正确
【发布时间】:2020-03-11 00:01:19
【问题描述】:

我刚刚开始学习 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

作为奖励,当用户调整窗口大小时,有没有办法动态确定GridLayout 中的cols 属性?例如,如果用户增加了窗口的宽度,那么应用程序应该支持更大的col 大小。同样,如果用户缩小窗口,应用程序应该减小col 的大小。

【问题讨论】:

    标签: python python-3.x kivy python-3.5 kivy-language


    【解决方案1】:
    <Gallery>:
        ScrollView:
            GridLayout:
                id: wall
                cols: 4
                size_hint_y:  None
                height: self.minimum_height
    

    Gallery 是 Widget 的子类,因此它不会特别努力调整其子项的大小或位置,因此 ScrollView 的默认大小为 (100, 100),位置为 (0, 0),因此放置了 GridLayout在同一区域内,因此您所有的图像都放在那个小区域内。

    解决方案是使 Gallery 成为适当的布局类型,例如一个 BoxLayout。

    作为奖励,当用户调整窗口大小时,有没有办法动态确定 GridLayout 中的 cols 属性?

    在 kv 中:cols: some_function_of(Window.size).

    【讨论】:

    • 我想我明白了...我试了一下并更改了类定义:class Gallery(BoxLayout),但现在我看不到任何图像,只看到 4 个标签。应该有 150 张图片+标签?
    • 它们只是在 ScrollView 的可见部分之外吗?如果您尝试滚动会发生什么?
    • 我根本无法滚动。你可以在这里看到我只看到 4 个标签和空图像:imgur.com/a/xBOOK7R
    • 啊,我想通了...size_hint_y: None 将宽度减小到 0,我想。删除它,我会看到图像。虽然它们都被压在一起,也没有发生任何滚动,只是像纸牌一样垂直堆叠在一起。是不是因为我的动态BoxLayout ("bl") 在添加到网格时没有大小?我尝试使用 size 属性,但无论如何图像仍然堆叠。仍然不太明白在 kivy 中是如何布局的 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多