How do you scroll a GridLayout inside Kivy ScrollView?

前端 未结 2 610
天命终不由人
天命终不由人 2020-12-19 09:18

At the moment this is my kv code that is not scrollable:

BoxLayout:
    id: bl
    orientation: \'vertical\'
    padding: 10, 10
    row_default_height: \'48         


        
相关标签:
2条回答
  • 2020-12-19 09:38

    According to the documentation for ScrollView you have to disable at least one of the ScrollView's child size_hint:

    <Controller>:
        layout_content: layout_content
        BoxLayout:
            id: bl
            orientation: 'vertical'
            padding: 10, 10
            row_default_height: '48dp'
            row_force_default: True
            spacing: 10, 10
            ScrollView:
                size: self.size
                GridLayout:
                    id: layout_content
                    size_hint_y: None
                    cols: 1
                    row_default_height: '20dp'
                    row_force_default: True
                    spacing: 0, 0
                    padding: 0, 0
    
                    Label:
                        text: "Lorem ipsum dolor sit amet"
    

    And bind the layout's size to adapt itself:

    # main.py
    
    class Controller(FloatLayout):
        layout_content=ObjectProperty(None)
    
        def __init__(self, **kwargs):
            super(Controller, self).__init__(**kwargs)
            self.layout_content.bind(minimum_height=self.layout_content.setter('height'))
    
    0 讨论(0)
  • 2020-12-19 09:55

    works and fixes issue of scrollview not resizing length with window when maximized. No kv for those needing it without

    kivy.require('1.11.1')
          
    class ScrollTest(ScrollView):
        def __init__(self,**kwargs):
            super().__init__(**kwargs)
        
            Window.bind(on_maximize=self.testing)
            
            self.size_hint = (1,None)
            self.pos_hint = {'center_x':0.5,'top': 1}
            self.size = (Window.width,Window.height)
    
            self.inside = GridLayout()
            self.inside.cols = 1
            self.inside.size_hint_y= None
            self.inside.spacing = 10
            
            self.inside.bind(minimum_height=self.inside.setter('height'))#checks when window maximized
            
            for i in range(1,5):
                self.submit = Button(text='something',size_hint_y=None, height=40)
                self.submit.bind(on_press=self.wPressed)
                self.inside.add_widget(self.submit)
            
            self.add_widget(self.inside)
            
        def wPressed(self,instance):
            self.submit = Button(text='something',size_hint_y=None, height=40)
            self.submit.bind(on_press=self.wPressed)
            self.inside.add_widget(self.submit)
                
        def testing(self,instance):
            self.size= (Window.width,Window.height)
    
            
    class MyApp(App):
        def build(self):
            self.screen_manager = ScreenManager()
            
            '''Creation of login screen'''
            self.login_page = ScrollTest()
            screen = Screen(name= 'Login')
            screen.add_widget(self.login_page)
            self.screen_manager.add_widget(screen)
            
            return self.screen_manager
    
    
    if __name__ == '__main__':
        MyApp().run()
    
    0 讨论(0)
提交回复
热议问题