ScrollView widget not scolling in kivy

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


    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.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”:

  1. You got to be sure that you set the size_hint_y to None, because the default 1 is not convenient in this case
  2. Bind the minimum_height of the GridLayout to layout.setter('height').
  3. Be sure that the ScrollView has the right size to accommodate the scroll

This example is pretty much what you find in the documentation:

from 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.
        for i in range(30):
            btn = Button(text=str(i), size_hint_y=None, height=40)
        root = ScrollView()
        return root

if __name__ == '__main__':

In this example, the ScrollView is the size of the Window but you can manipulate it with the size_hint and size properties.

Leave a Reply

Your email address will not be published. Required fields are marked *