让ModalView适应其所有内容小部件(kivy)

2024-04-23 20:42:03 发布

您现在位置:Python中文网/ 问答频道 /正文

将一组小部件添加到kivy中的ModalView中,以使模式窗口动态适应其所有内容(而不将高度设置为硬编码像素大小)的正确方法是什么

我有以下示例脚本:

#!/usr/bin/env python3

import kivy
from kivy.uix.modalview import ModalView
from kivy.lang import Builder
from kivy.app import App

KV = """
BoxLayout:
    ModalView:
        size_hint: 0.9, None

        BoxLayout:
            orientation: 'vertical'

            Label:
                text: 'Dialog Title'
                font_size: 30

            Label:
                text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
            Label:
                text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
            Label:
                text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
            Label:
                text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit."

            StackLayout:
                orientation: 'rl-tb'

                Button:
                    text: "OK"
                    size_hint: None, None
                    size: self.texture_size
                    padding: '8dp', '8dp'

                Button:
                    text: "Cancel"
                    size_hint: None, None
                    size: self.texture_size
                    padding: '8dp', '8dp'
"""

class MyApp(App):
    def build(self):
        return Builder.load_string( KV )


MyApp().run()

正如kivy langauge所描述的,我希望一个模式显示为应用程序宽度的90%,高度应该动态调整以适应模式的所有内容

模态的内容应该是一个“标题”标签,下面有一组“正文”标签。这些标签下面应该有两个按钮,它们显示在同一行上。非常直截了当

但我得到的是:

widgets not appearing properly in kivy modal view

请注意,上图显示:

  1. 这些按钮大多在模态外部
  2. 标题标签部分位于以下标签的顶部(这不是BoxLayout的工作方式)
  3. 标题标签也部分位于模态之外

如何修复此脚本以使模态的内容按预期显示


Tags: textimportnone内容size标签labelipsum
2条回答

您可以在kv中放置一条规则,描述如何构建ModalView,而不使其成为任何小部件的子部件。见documentation。您可以使用如下规则:

<MyModal@ModalView>:

    BoxLayout:
        orientation: 'vertical'

        Label:
            text: 'Dialog Title'
            font_size: 30

        Label:
            text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
        Label:
            text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
        Label:
            text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
        Label:
            text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit."

        StackLayout:
            orientation: 'rl-tb'

            Button:
                text: "OK"
                size_hint: None, None
                size: self.texture_size
                padding: '8dp', '8dp'

            Button:
                text: "Cancel"
                size_hint: None, None
                size: self.texture_size
                padding: '8dp', '8dp'

然后在python代码中,创建如下ModalView

from kivy.factory import Factory
modal_inst = Factory.MyModal()
modal_inst.open()

如果使用size_hint: 0.9, None,则必须指定ModalViewheight。最简单的方法是让小部件通过使用子项的minimum_height进行计算。大概是这样的:

<MyModal@ModalView>:
    size_hint: 0.9, None
    height: box.height
    BoxLayout:
        id: box
        orientation: 'vertical'
        size_hint: 1, None
        height: self.minimum_height
        padding: 5
        spacing: 5

        Label:
            text: 'Dialog Title'
            font_size: 30
            pos_hint: {'center_x': 0.5}
            size_hint: None, None
            size: self.texture_size

        Label:
            text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
            pos_hint: {'center_x': 0.5}
            size_hint: None, None
            size: self.texture_size
        Label:
            text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
            pos_hint: {'center_x': 0.5}
            size_hint: None, None
            size: self.texture_size
        Label:
            text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
            pos_hint: {'center_x': 0.5}
            size_hint: None, None
            size: self.texture_size
        Label:
            text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
            pos_hint: {'center_x': 0.5}
            size_hint: None, None
            size: self.texture_size

        StackLayout:
            orientation: 'rl-tb'
            size_hint: 1, None
            height: self.minimum_height

            Button:
                text: "OK"
                size_hint: None, None
                size: self.texture_size
                padding: '8dp', '8dp'

            Button:
                text: "Cancel"
                size_hint: None, None
                size: self.texture_size
                padding: '8dp', '8dp'

请注意,使用minimum_height要求该Layout的子级必须具有定义良好的heights

相关问题 更多 >