Как правильно использовать ScrollView в Kivy Python? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть этот код, где я хочу изменить положение кнопок, но если я изменю положение, прокрутка больше не работает. Как сделать так, чтобы это работало? Ниже рабочая версия. Если я изменил size_hint: 1, .1 на size_hint: 1, .7, прокрутка больше не работает ...

from kivy.app import App
from kivy.lang.builder import Builder
from kivy.uix.floatlayout import FloatLayout

Builder.load_string('''
<Root>:
    ScrollView:
        size_hint: 1, .1
        GridLayout:
            size_hint_y: None
            cols: 1
            # minimum_height: self.height
            Button
                text: 'one'
            Button:
                text: 'two'
            Button:
                text: 'three'
            Button:
                text: 'four'
''')

class Root(FloatLayout):
    pass

class DemoApp(App):

    def build(self):
        return Root()

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


Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Как только в родительском виджете есть size_hint_y = None, вы должны вручную объявить высоту дочернего виджета, поскольку size_hint_y имеет дело с высотой или осью Y. поэтому я изменил ваш код, чтобы сделать вещи проясняются

from kivy.app import App
from kivy.lang.builder import Builder
from kivy.uix.floatlayout import FloatLayout

Builder.load_string('''
<Root>:
    ScrollView:
        size_hint_y:None
        height:root.width / 2
        GridLayout:
            size_hint_y: None
            cols: 1
            height:self.minimum_height
            spacing:dp(20)
            Button
                text: 'one'
                size_hint_y:None
                height:dp(50)
            Button:
                text: 'two'
                size_hint_y:None
                height:dp(50)
            Button:
                text: 'three'
                size_hint_y:None
                height:dp(50)
            Button:
                text: 'four'
                size_hint_y:None
                height:dp(50)
''')

class Root(FloatLayout):
    pass

class DemoApp(App):

    def build(self):
        return Root()

if __name__ == '__main__':
    DemoApp().run()
0 голосов
/ 02 апреля 2020

Вы делаете это правильно. ScrollView позволяет вам прокручивать, чтобы увидеть части вашего GridLayout, которые не вписываются в ScrollView. Когда вы устанавливаете size_hint на (1, .7), все вписывается в ScrollView, поэтому оно не прокручивается.

Вы можете принудительно прокрутить, добавив Widgets, чтобы занять больше места (например, Labels без текста):

<Root>:
    ScrollView:
        size_hint: 1, .7
        GridLayout:
            size_hint_y: None
            cols: 1
            height: self.minimum_height
            Label:
                text: ''
                size_hint_y: None
                height: 300
            Button
                text: 'one'
                size_hint: 1, None
                height: self.texture_size[1]
            Button:
                text: 'two'
                size_hint: 1, None
                height: self.texture_size[1]
            Button:
                text: 'three'
                size_hint: 1, None
                height: self.texture_size[1]
            Button:
                text: 'four'
                size_hint: 1, None
                height: self.texture_size[1]
            Label:
                text: ''
                size_hint_y: None
                height: 300
...