带有boxlayout的kivy滚动视图

Posted

技术标签:

【中文标题】带有boxlayout的kivy滚动视图【英文标题】:kivy scrollview with boxlayout 【发布时间】:2015-09-30 19:14:18 【问题描述】:

我目前正在熟悉 kivy。 我认为它有很大的潜力,但我确实发现“普通 python”和 kv 语言之间的关系有点令人困惑,这使得很难理解在哪里做项目。目前在我看来,使用 python 与 kv-l 时的行为(幕后发生的事情)并不是一对一的,总的来说,我认为这使得可用性/生产力的标准相当高。

我和其他人一起使用了“速成课程”,这是获得对 kivy 第一印象的良好开端。 无论如何,在学习的过程中,我只是想看看我是否可以制作一个可滚动的 box-view - 结果我做不到。

需要什么才能使这段代码正常工作,即将标签扩展到它们的“纹理大小”,同时拥有一个可以调整的 ScrollView?

如果 BoxLayout 有 size_hint_y: None,则标签不会扩展到文本,但是当窗口非常小时,可以看到滚动视图。

如果 BoxLayout 有 size_hint_y: 1,则标签会展开,但显然 boxlayout 的高度根本没有改变,即滚动视图窗口似乎与 size_hint_y: None 相同

如果我只是输入一个很大的高度,滚动视图会覆盖它,但我希望可以获得与其内容耦合的 boxlayout 的动态高度。

我玩过高度、size_hints 等,但我没有找到有效的组合,有时会收到警告说由于内部重绘循环需​​要重新编写代码?

我错过/不理解什么?

代码如下。

from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.uix.scrollview import ScrollView

Builder.load_string("""

<ScrollableLabel>:
    BoxLayout:
        orientation: 'vertical'
        # size_hint_y: 1
        size_hint_y: None
        height: 400 #self.size[1]
        canvas:
            Color:
                rgba: (1, 0, 0, .5) # DarkOliveGreen
            Rectangle:
                size: self.size
                pos: self.pos
        Label:
            id: bust
            text: 'a string that is long ' * 10
            font_size: 50
            text_size: self.width, None
            size_hint_y: None
            height: self.texture_size[1]
            canvas:
                Color:
                    rgba: (0, 1, 0, .5) # DarkOliveGreen
                Rectangle:
                    size: self.size
                    pos: self.pos
        Label:
            text: '2 strings that are long ' * 10
            text_size: self.width, None
            size_hint_y: None
            height: self.texture_size[1]
        Button:
            text: 'just testing'



""")

class ScrollableLabel(ScrollView):
    pass

runTouchApp(ScrollableLabel())

【问题讨论】:

【参考方案1】:

BoxLayout 旨在使其子元素填充自己。您想要的动态调整大小的更好布局是 GridLayout,它有一个 minimum_height 可以绑定到自动调整大小。

<ScrollableLabel>:
    GridLayout:
        cols: 1
        size_hint_y: None
        height: self.minimum_height
        canvas:
            Color:
                rgba: (1, 0, 0, .5) # DarkOliveGreen
            Rectangle:
                size: self.size
                pos: self.pos
        Label:
            id: bust
            text: 'a string that is long ' * 10
            font_size: 50
            text_size: self.width, None
            size_hint_y: None
            height: self.texture_size[1]
            canvas:
                Color:
                    rgba: (0, 1, 0, .5) # DarkOliveGreen
                Rectangle:
                    size: self.size
                    pos: self.pos
        Label:
            text: '2 strings that are long ' * 10
            text_size: self.width, None
            size_hint_y: None
            height: self.texture_size[1]
        Button:
            text: 'just testing'
""")

【讨论】:

感谢按预期工作,我自己不会想出来的。

以上是关于带有boxlayout的kivy滚动视图的主要内容,如果未能解决你的问题,请参考以下文章

Kivy:如何从自定义 BoxLayout 显示 ScrollView?

(垂直)滚动视图包含另一个(水平)滚动视图 - Kivy

在kivy中禁用弹跳滚动效果

Kivy ScrollView - 不滚动

如何在 Kivy python 中最大化滚动条?

标签上gridlayout内的kivy滚动视图