I'm having some issues using the ScollView Widget in an attempt to make a dynamically-generated stack of labels scrollable. It's possible that I'm misunderstanding the way ScrollView should be utilized, so I'm hoping somebody could clarify it for me. The following code reads a bunch of data from a csv, and when that code is displayed, if there is a lot of data, the program will basically try to compress all the text/Labels into the GridLayout. I'd like the data to be scrollable. Here's an abstracted version of the code:
class showData(Screen):
def __init__(self, **kwargs):
    super(showData, self).__init__(**kwargs)
    self.my_data = read_csv_to_dict()
    self.data_exists = 0 if len(self.my_data) == 0 else 1 
    ### Create Widgets ###      
    layout_main = BoxLayout(orientation = 'vertical')
    layout_back_button = BoxLayout(padding = [0, 0, 0, 20])
    self.layout_data = GridLayout(cols = 3 if self.data_exists else 1)  
    self.scrollview_data = ScrollView()
    button_back = Button(text = 'Main menu')
    ### Add widgets ###
    self.add_widget(layout_main)
    layout_main.add_widget(layout_back_button)
    layout_main.add_widget(self.scrollview_data)
    layout_back_button.add_widget(button_back)
    if self.data_exists:
        self.layout_data.add_widget(Label(text = 'label 1'))
        self.layout_data.add_widget(Label(text = 'label 2'))
        self.layout_data.add_widget(Label(text = 'label 3'))
        self.display_data(self)
        self.scrollview_data.add_widget(self.layout_data)
    else:
        self.scrollview_data.add_widget(Label(text = 'Records are empty'))
    ### Create button bindings ###
    button_back.bind(on_press = switch_screen_to_main)      
def display_data(obj, self):
    data_dictReader = read_csv_to_dictReader()
    for data_row in data_dictReader:
        for value in data_row.values():
            self.layout_data.add_widget( Label( text = value))
The GridLayout/data is not scrollable. Can someone tell me how to fix the code above to make it scrollable? Thank you.
You are missing a few things from the Kivy Documentation on your GridLayout. They are necessary to make sure that the GridLayout is "big enough to scroll":
size_hint_y to None, because the default 1 is not convenient in this caseminimum_height of the GridLayout to layout.setter('height').ScrollView has the right size to accommodate the scrollThis example is pretty much what you find in the documentation:
from kivy.app import App
from kivy.uix.scrollview import ScrollView
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
class Example(App):
    def build(self):
        layout = GridLayout(cols=1, spacing=10, size_hint_y=None)
        # Make sure the height is such that there is something to scroll.
        layout.bind(minimum_height=layout.setter('height'))
        for i in range(30):
            btn = Button(text=str(i), size_hint_y=None, height=40)
            layout.add_widget(btn)
        root = ScrollView()
        root.add_widget(layout)
        return root
if __name__ == '__main__':
    Example().run()
In this example, the ScrollView is the size of the Window but you can manipulate it with the size_hint and size properties.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With