正如标题所示,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%
行和列大小的基本计算在 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)