标签上gridlayout内的kivy滚动视图

Posted

技术标签:

【中文标题】标签上gridlayout内的kivy滚动视图【英文标题】:kivy scrollview inside gridlayout on label 【发布时间】:2017-11-06 00:42:34 【问题描述】:

我试图创建一个具有一组根规则的单屏应用程序。通过按下一个按钮,我应该在按钮旁边的网格中看到一个可滚动的文本。在所有示例解决方案中,我看到滚动视图在我在其他问题中看到的类似 KV 文件中工作。有人可以找出我在 KV 文件中遗漏的内容。

我的 .py 文件:

import kivy
import string
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty
from kivy.properties import StringProperty
from kivy.uix.scrollview import ScrollView
from kivy.core.window import Window

class RootContainer(BoxLayout):
    instance = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(RootContainer, self).__init__(**kwargs)

    def clickAction1(self, instance):
        #identify the button pressed
        buttonText = instance.text
        self.lbl1.text = instance.text + " some text goes here ... "
        myresult = " this is scrolling text.\n " * 30
        self.lbl5.text = myresult

class MBApp(App):
    def build(self):
        return RootContainer()


if __name__ == '__main__':
    MBApp().run()

我的 KV 文件:

#:kivy 1.0.9
<RootContainer>:
    id: theRoot
    lbl1: my_labelC
    lbl5: my_labelCS
BoxLayout:
    orientation: 'vertical'
    spacing: 20
    padding: 20
    canvas: 
        Color: 
            rgb: 0, .33, 0 
        Rectangle: 
            pos: self.pos 
            size: self.size
    Button:
        text: "This is 1st button"
        text_size: self.size
        size_hint: (.5,1)
        on_press: theRoot.clickAction1(self)
    Button:
        text: "This is 2nd button"
        text_size: self.size
        size_hint: (.5,1)
        on_press: root.clickAction1(self)

GridLayout:
    rows: 2
    cols: 1
    spacing: 10
    padding: 10
    canvas: 
        Color: 
            rgb: .7, .63, 0  
        Rectangle: 
            pos: self.pos 
            size: self.size
    Label:
        id: my_labelC
        canvas.before:
            Color:
                rgb: 0,0,0
            Rectangle:
                pos: self.pos
                size: self.size
        text: "Header text for button clicked ......."
        text_size: self.size
    ScrollView:
        GridLayout:
            cols:1
            rows:1
            height: self.minimum_height
            Label:
                id: my_labelCS
                text: "Scrolling text goes here ....."

我希望这不是重复的。也欢迎任何其他代码建议。谢谢。

【问题讨论】:

【参考方案1】:

您没有设置标签的大小,因此默认值适用,与任何小部件一样,默认值是

size: 100, 100
size_hint: 1, 1

由于size_hint1, 1,并且父级是布局,size本身被父级可用空间覆盖

由于您在父布局中设置了size: minimum_size,它会给出其子布局所需的最小尺寸,但标签不要求任何空间,它是size_hint1, 1 意味着它很乐意接受所有可用空间。 Kivy 通过不给它任何空间来解决这种情况,因此 Label 大小最终为 0, 0,GridLayout 的大小也是如此。

所以你想禁用 size_hint(至少对于标签的高度,而是将其设置为纹理高度

size_hint_y: None
height: self.texture_size[1]

通常通过设置 text_size 将纹理宽度设置为可用宽度。

text_size: self.width, None
size_hint_x: 1    # this is the default, so this line is not required, but you want to be sure not to disable this default

【讨论】:

谢谢Tshirtman。很好的解释。它阐明了我对父子大小如何交互的理解。【参考方案2】:

您真的需要滚动视图中的 GridLayout 吗?这对我有用:

ScrollView:
    Label:
        id: my_labelCS
        size_hint: 1, None
        text_size: self.width, None
        height: self.texture_size[1]
        text: "Scrolling text goes here ....."

【讨论】:

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

KIVY python - 布局中的滚动视图

如何在 Kivy 的 Scrollable GridLayout 中显示图像

Kivy 滚动浏览数千行文本

Kivy:为啥 ScrollView 不能在 GridLayout 中工作?

如何在表格视图 IOS 内的滚动视图中创建文本字段

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