kivy滚动视图中灵活的对象数量

flexible number of objects in kivy scrollview

我正在尝试使用一个屏幕上的输入在第二个屏幕上使用 kivy 制作列表。基本思想是将一个段落分解成单词,然后显示在另一个页面上。下面是一个最小的例子。

现在的情况是文字被挤压在一起,没有滚动。

在main.py中:

from kivy.app import App
from kivy.app import Widget

from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty


class InputScreen(Screen):
    wordList = ObjectProperty()
    def getwords(self):
        self.wordList=[]
        s = self.ids.textInput.text.split()
        for w in s:
            for punctuation in [',','.','!','?']:
                w.strip(punctuation)

            self.wordList.append(w)

        return None

class WordLabel(Label):
    pass

class WordScreen(Screen):
    wordList = ObjectProperty()
    def updateWords(self):
        self.ids.scrollContainer.clear_widgets()
        wordGrid = GridLayout(cols=2,size_hint_y=None)
        wordGrid.bind(minimum_height=wordGrid.setter('height'))
        for w in self.wordList:
            wordGrid.add_widget(Label(text=w))
            wordGrid.add_widget(Label(text='property of word'))

        self.ids.scrollContainer.add_widget(wordGrid)

class testScreenManager(ScreenManager):
    pass

class testApp(App):
    def build(self):
        sm = testScreenManager()
        return sm


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

在test.kv中:

<testScreenManager>
    InputScreen:
        id: inputScreen
        name: 'input'
    WordScreen:
        id: wordScreen
        name: 'word'
        wordList: inputScreen.wordList


<InputScreen>:
    GridLayout:
        cols: 1
        TextInput:
            id: textInput
            hint_text: 'Input paragraph'
        BoxLayout:
            orientation: 'horizontal'
            size_hint_y: .2
            Button:
                text: 'Analyze paragraph'
                on_press: root.getwords()
            Button:
                text: 'See word list'
                on_press:
                    root.getwords()
                    root.manager.transition.direction = 'left'
                    root.manager.current = 'word'
        BoxLayout:
            orientation: 'horizontal'
            size_hint_y: .2
            Label:
                id: wordCountResult
                text: ''


<WordScreen>:
    on_enter: root.updateWords()
    BoxLayout:
        orientation: 'vertical'
        BoxLayout:
            id: rowLabels
            orientation: 'horizontal'
            size_hint_y: .2
            Label:
                text: 'Words not at grade level:'
                size_hint_x: .5
            Label:
                text: 'Grade Level'
                size_hint_x: .5
        ScrollView:
            id: scrollContainer
            size_hint: (None,None)
            size: (self.parent.width,self.parent.height - rowLabels.height - buttonRow.height)
        Button:
            id: buttonRow
            size_hint_y: .2
            text: 'Back'
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.current = 'input'
<WordLabel>:
    size_hint_y: None
    height: '29sp'

我试过对 ScrollView 使用 size_hint_y=.6,并在 wordGrid.bind(minimum_height=wordGrid.setter('height')) 中交换 heightminimum_height

我以为会发生的事情是,ScrollView 容器的高度将是 window 减去其他两个小部件使用的高度。在 ScrollView 内部,WordGrid 更长(高度绑定到所有子项所需的最小高度),因此滚动用于查看所有项目。我一定没有理解有关 heights/sizes 的 ScrollView、WordGrid 和 WordGrid 子项的一些事实。有人有一些见解吗?

这部分代码:

for w in self.wordList:
        wordGrid.add_widget(Label(text=w))
        wordGrid.add_widget(Label(text='property of word'))

默认情况下 Label 会有 size_hint_y=1。相反,size_hint_y=None 是必要的。可以设置高度,就像在 WordLabel class 中所做的那样 - 这是 OP(我)的意思。

感谢相关问题帮助我发现错误。