为什么 Kivy ScrollView children of child 不可滚动?

Why Kivy ScrollView children of child are not scrollable?

这是 python-script 运行 kivy:

的一部分
class someclass(Widget):
# code
# code
Clock.schedule_interval(self.timeandlog, 0.1)
self.x = 20
def timeandlog(self,dt):
    if condition == True: # 
       self.ids.pofchild.add_widget(Label(text=logmsg, pos = (10, self.x)))
       self.x = self.x + 10   ### just playing with position 
       condition = False  

kv 文件:

<someclass>

    #somelabels and buttons:

    ScrollView:
        do_scroll_x: False
        do_scroll_y: True
        pos: root.width*0.3, root.height*0.7
        size: root.width*0.8, root.height*0.7 
        Widget:
            cols: 1 
            spacing: 10
            id: pofchild

现在我知道 ScrollView 接受一个 Widget 所以我只添加了一个 id: pofchild 然后我在里面添加了标签 self.ids.pofchild.add_widget(Label() 并更改每个新标签的pospos=(20, self.x) 但标签不可滚动且仅填充小部件高度然后停止出现。什么是正确的属性以便它们可以滚动?

一般来说,当你想要Widget包含其他Widgets时,你应该使用LayoutWidget。简单的 Widget 不支持 size_hintpos_hint,因此简单的 Widget 的 children 通常以默认大小 (100,100) 结束,并且默认位置 (0,0).

所以,一个好的开始是改变:

class someclass(Widget):

类似于:

class Someclass(FloatLayout):

请注意,class 名称以大写字母开头。虽然它不会在您的示例中造成任何困难,但当您使用 kv 并且您的 classname 以小写字母开头时,它可能会产生错误。

同样,ScrollView 的 child 通常也是 Layout。一种可能是GridLayout,像这样:

    GridLayout:
        size_hint_y: None
        height: self.minimum_height
        cols: 1 
        spacing: 10
        id: pofchild

这里的Keys属性是size_hint_y: Noneheight: self.minimum_height。它们允许 GridLayout 随着更多 children 的添加而增长,其高度将计算为包含 children 所需的最小高度。

然后,你可以这样添加children:

self.ids.pofchild.add_widget(Label(text=logmsg, pos=(10, self.x), size_hint_y=None, height=50))

由于我们期望 GridLayout 计算其最小高度,我们必须为其 children 提供明确的 height,因此 size_hint_y=None, height=50.