RecycleView 中的 Kivy 尺码标签

Kivy sizing label inside RecycleView

我希望我的标签具有显示文本所需的高度。它位于 RecycleView 中。我认为我的代码应该在 RecycleView 之外工作。

如何使 Label 足够大,以便其内容易于阅读? 与它已经适用于 CodeInput 和 TextInput 的方式相同。

from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.uix.recycleview import RecycleView
from kivy.uix.label import Label
from kivy.uix.recycleboxlayout import RecycleBoxLayout
from kivy.uix.behaviors import FocusBehavior
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from kivy.properties import StringProperty


Builder.load_string('''
<RV>:
    viewclass: 'SnippetView'
    RecycleBoxLayout:
        default_size: None, dp(56)
        default_size_hint: 1, None
        size_hint_y: None
        height: self.minimum_height
        orientation: 'vertical'
        spacing: 10

<SnippetView>:
    canvas.before:
        Color:
            rgb: (255,0,0)
        Rectangle:
            pos: self.pos
            size: self.size
    orientation: 'vertical'

    Label:
        text: root.heading
        text_size: root.width, None
        size: self.texture_size
    TextInput:
        text: root.dscrpt
        size_hint_y: None
        height: self.minimum_height
    CodeInput:
        text: root.code
        size_hint_y: None
        height: self.minimum_height

''')

class SnippetView(BoxLayout):
    heading = StringProperty()
    dscrpt = StringProperty()
    code = StringProperty()


class RV(RecycleView):
    def __init__(self, **kwargs):
        super(RV, self).__init__(**kwargs)
        self.data = [{'heading': str(x),'dscrpt': str(x),'code': str(x)} for x in range(100)]

rv = RV()
runTouchApp(rv)

我也很感谢大家对 RecycleView 的一般评论,因为我是第一次使用它。

您必须绑定一个方法来在标签值更改时更新 SnippetViewheight,因为您已在 RV 的规则中修复了它。试试这个:

...

Builder.load_string('''

...

<SnippetView>:
    canvas.before:
        Color:
            rgb: (255,0,0)
        Rectangle:
            pos: self.pos
            size: self.size
    orientation: 'vertical'

    Label:
        id: l
        text: root.heading
        text_size: root.width, None
        size: self.texture_size
    TextInput:
        id: ti
        text: root.dscrpt
        size_hint_y: None
        height: self.minimum_height
    CodeInput:
        id: ci
        text: root.code
        size_hint_y: None
        height: self.minimum_height

''')

class SnippetView(BoxLayout):
    heading = StringProperty()
    dscrpt = StringProperty()
    code = StringProperty()

    def __init__(self, **kwargs):
        super(SnippetView, self).__init__(**kwargs)
        self.ids.l.bind(height=self.update)

    def update(self, *args):
        self.height = self.ids.l.texture_size[1] + self.ids.ti.height + self.ids.ci.height

...