2

I'm building an application with Kivy that will have a bunch of drop down items. When I make an accordion bigger than the screen I get, "Not Enough Space to Display All Children." Since, I have too many children to display on one page and don't want to display all of them at once anyway; how do i tell the program to not worry about it and just enable a scrolldown functionality? For the life of me I cannot find any examples on the internet where large accordions have an added scrolling function. All the solutions I have found on the internet simply say "Make more space".

The code below creates 30 accordion items that do not fit on the screen and produces the error. Thank you in advance and if you require any more clarification I will be happy to provide it.

from kivy.uix.accordion import Accordion, AccordionItem
from kivy.uix.label import Label
from kivy.app import App


class AccordionApp(App):
    def build(self):
        root = Accordion(orientation='vertical')
        for x in range(30):
            item = AccordionItem(title='Title %d' % x)
            item.add_widget(Label(text='Very big content\n' * 10))
            root.add_widget(item)
        return root


if __name__ == '__main__':
    AccordionApp().run()
eyllanesc
  • 235,170
  • 19
  • 170
  • 241
Whip
  • 133
  • 2
  • 10
  • I think it's a bug, I recommend reporting it – eyllanesc Nov 19 '18 at 21:43
  • I doubt that reporting it as a bug will help, since it is acting exactly as [documented](https://kivy.org/doc/stable/api-kivy.uix.accordion.html). Perhaps a feature request suggesting that the `Accordion` container be placed in a `ScrollView`. – John Anderson Nov 20 '18 at 02:18
  • @JohnAnderson Given that Accordion doesn't appear to allow that functionality, do you have any recommendations of a python GUI that would allow something similar to be programmed? Or would it be best to go outside of Python and learn HTML/CSS/JAVASCRIPT for more control. – Whip Nov 20 '18 at 17:29

1 Answers1

3

You can adjust the size of the Accordion, if you can calculate the size needed, and put the Accordion in a ScrollView. For example:

from kivy.core.window import Window
from kivy.uix.accordion import Accordion, AccordionItem
from kivy.uix.label import Label
from kivy.app import App
from kivy.uix.scrollview import ScrollView


class AccordionApp(App):
    def build(self):
        root = ScrollView(size_hint=(None, 1), size=(Window.width, Window.height))
        acc = Accordion(size_hint_x=None)
        width_calc = 200     # guess at width needed for one open item content
        root.add_widget(acc)
        for x in range(30):
            item = AccordionItem(title='Title %d' % x)
            item.add_widget(Label(text='Very big content\n' * 10))
            acc.add_widget(item)
            width_calc += item.min_space    # add minimum width for an item
        acc.width = width_calc              # set Accordion width
        return root


if __name__ == '__main__':
    AccordionApp().run()
John Anderson
  • 35,991
  • 4
  • 13
  • 36
  • Thanks John! This is exactly what I was looking for. As a side question (maybe I should make a new Stack Overflow question for this), in fullscreen mode the scrollview doesn't appear to take up the entire window width. Is this due to the program still working off the non fullscreen 'window.width' variable? Is there a way to make this variable dynamic in the event I resize the frame? – Whip Nov 21 '18 at 00:20
  • I think if you just change the `ScrollView` creation line to `root = ScrollView()`, the `ScrollView` should fill the entire screen. – John Anderson Nov 21 '18 at 03:28
  • Great! Thank you very much for your help John. – Whip Nov 21 '18 at 03:52