Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ScrollView widget not scolling in kivy

Tags:

python

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

like image 946
James_L Avatar asked Feb 15 '23 04:02

James_L


1 Answers

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

like image 120
toto_tico Avatar answered Feb 22 '23 23:02

toto_tico