Kivy中的ScrollView和BoxLayout

10
我目前正在熟悉kivy。 我认为它有很大的潜力,但我发现“普通python”和kv语言之间的关系有点混乱,这使得很难理解在哪里做项目。目前,对我来说,在使用python与kv-l时行为(幕后发生的事情)不是一对一的,总的来说,我认为这使得可用性/生产力的门槛相当高。
我已经使用了inclement的“崩溃课程”等等,这是一个很好的开始,可以让人们对kivy有第一印象。无论如何,在学习过程中,我只想看看是否能够使框视图可滚动-结果我不能。
要使此代码工作,即扩展标签到其“纹理大小”,同时具有调整到该大小的ScrollView,需要什么?
如果BoxLayout具有size_hint_y: None,则标签不会展开到文本,但是在使窗口变得非常小的情况下,可以看到ScrollView在起作用。
如果BoxLayout具有size_hint_y: 1,则标签会展开,但显然BoxLayout的高度根本不会改变,即ScrollView窗口似乎与size_hint_y: None相同。
如果我只输入一个较大的高度,则ScrollView将覆盖此高度,但我希望可以获得与其内容相关联的BoxLayout的动态高度。
我已经尝试过高度,size_hint等,但没有找到有效的组合,有时会收到警告,要求重新制作代码,因为存在内部重绘循环?
我缺少/不理解什么?
如下所示的代码。
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个回答

16

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'
""")

谢谢,这个按照预期工作了。我自己想不出来。 - ahed87
在这种情况下,为什么需要设置 Label -> size_hint_y: None - Mtl Dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接