如何在Kivy ScrollView中滚动GridLayout?

10 投票
2 回答
21831 浏览
提问于 2025-04-30 23:52

目前这是我的kv代码,但它不能滚动:

BoxLayout:
    id: bl
    orientation: 'vertical'
    padding: 10, 10
    row_default_height: '48dp'
    row_force_default: True
    spacing: 10, 10

    GridLayout:
        id: layout_content
        cols: 1
        row_default_height: '20dp'
        row_force_default: True
        spacing: 0, 0
        padding: 0, 0

        Label:
            text: 'You don''t have any downloads. Please add new download from Home screen'

我该如何让上面的kv代码可以滚动呢?我知道Kivy的ScrollView只能接收一个子元素,而我已经把GridLayout设置为一个新的ScrollView的子元素。但它还是不行。有什么建议吗?

暂无标签

2 个回答

0

这个代码可以解决一个问题,就是当窗口最大化时,滚动视图的长度不会自动调整。对于那些不需要使用kv文件的人来说,这个代码也适用。

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()
22

根据ScrollView的文档,你需要至少关闭一个ScrollView里面孩子的大小提示(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"

然后要把布局的大小绑定起来,这样它才能自动适应:

# 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'))

撰写回答