Kivy 使用 kv 文件。网格布局大小提示不起作用

问题描述 投票:0回答:1

正如标题所示,FileChooserListView 占据了整个网格,而不仅仅是 50%。

class MediaSorterScreen(GridLayout):

    def __init__(self, **kwargs):
        super(MediaSorterScreen, self).__init__(**kwargs)
        Builder.load_file('MediaSorter.kv')

class MediaSorter(App):
    def build(self):
        return MediaSorterScreen()
    
if __name__ == '__main__':
    MediaSorter().run()

MediaSorter.kv

<MediaSorterScreen>:

    GridLayout:
        cols:2
        size: root.width - 200, root.height -200
        pos: 100, 100

        BoxLayout:
            orientation: 'vertical'
            size_hint: (0.5, 1.0)

            FileChooserListView:
                id: srcFolderInput
                path: 'D:\\Daniel'
                size_hint: (1.0, 1.0)

期望 FileChooserListView 占据 BoxLayout 的 100%,而 BoxLayout 应该占据 GridLayout 宽度的 50%,但 FileChooserListView 占据 GridLayout 的 100%

kivy kivy-language
1个回答
0
投票

行和列大小的基本计算在 GridLayout 文档中讨论。但有些细节并没有明确规定。如果一列中的所有小部件都定义了

width
(如
size_bint_x: None
width: 50
),则该列的宽度将为
50
。小部件具有
size_hint_x
值的任何列都将获得与该
GridLayout
成比例的剩余
width
size_hint_x
的份额。因此,继续相同的示例,如果剩余列中的 Widget 都具有
size_hint_x: 0.837
,则它们将均等地共享剩余宽度。在
GridLayout
中,
size_hint_x
的实际值并不重要,只有它的相对值才重要。

因此,在您的情况下,您有一个包含 2 列的

GridLayout
,但第二列中没有任何内容。第二列分配的宽度为 0,然后第一列与其他列共享剩余宽度(整个宽度),因此无论
size_hint_x
的值如何,它都会获得 GridLayout 的完整宽度。

解决方法是在第二列中提供一些内容来声明宽度的份额。比如:

<MediaSorterScreen>:

    GridLayout:
        cols:2
        size: root.width - 200, root.height -200
        pos: 100, 100

        BoxLayout:
            orientation: 'vertical'
            size_hint: (0.5, 1.0)

            FileChooserListView:
                id: srcFolderInput
                path: 'D:\\Daniel'
        Widget:
            size_hint: (0.5, 1.0)

并且,除非您计划向

BoxLayout
添加更多小部件,否则您可以消除它:

<MediaSorterScreen>:

    GridLayout:
        cols:2
        size: root.width - 200, root.height -200
        pos: 100, 100

        FileChooserListView:
            id: srcFolderInput
            path: 'D:\\Daniel'
            size_hint: (0.5, 1.0)
        Widget:
            size_hint: (0.5, 1.0)

更进一步,由于

MediaSorterScreen
本身就是一个
GridLayout
,因此你不需要在其中添加另一个
GridLayout

<MediaSorterScreen>:
    cols:2
    size_hint: .8, .8
    pos_hint: {'x': 0.1, 'y': 0.1}

    FileChooserListView:
        id: srcFolderInput
        path: 'D:\\Daniel'
        size_hint: (0.5, 1.0)
    Widget:
        size_hint: (0.5, 1.0)
© www.soinside.com 2019 - 2024. All rights reserved.