Kivy ScrollView+手风琴错误

Posted

技术标签:

【中文标题】Kivy ScrollView+手风琴错误【英文标题】:Kivy ScrollView+Accordion Error 【发布时间】:2013-03-16 22:40:24 【问题描述】:

我有这个代码。如果我将 Accordion 项目的数量增加到超过一定数量,应用程序就会失控。 gridLayout 版本(已注释掉)按预期工作。违规区域在 HERE 和 THERE 之间。

from kivy.app import App
from kivy.uix.spinner import Spinner, SpinnerOption
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.accordion import Accordion, AccordionItem
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.scrollview import ScrollView
from kivy.uix.gridlayout import GridLayout
from kivy.core.window import Window

class MusicController(App):

    def build(self):
        b = BoxLayout(orientation='vertical')
        top = Spinner(text = '12', values = ["Songs","Artist","Playlist","Search"], background_color = (.3,.2,.5,1), size_hint_y = 0.1)

    #< HERE >#

        items = Accordion(orientation='vertical')
        for x in xrange(30):
            item = AccordionItem(title='Title %d' % x)
            buttons = BoxLayout()
            buttons.add_widget(Button(text='Play'))
            buttons.add_widget(Button(text='Pause'))
            buttons.add_widget(Button(text='Pause'))
            item.add_widget(buttons)
            items.add_widget(item)

        #~ items = GridLayout(cols=1, spacing=10, size_hint_y=None)
        #~ items.bind(minimum_height=items.setter('height'))
        #~ for i in range(30):
            #~ btn = Button(text=str(i), 

    #< THERE >#

        sv = ScrollView(do_scroll_x = False)
        sv.add_widget(items)
        now_playing = BoxLayout(size_hint_y = 0.1)
        for widget in ["Prev","Play","Pause","Next","NP"]:
            now_playing.add_widget(Button(text=widget))

        b.add_widget(top)
        b.add_widget(sv)
        b.add_widget(now_playing)
        return b

if __name__ == '__main__':
    MusicController().run()

【问题讨论】:

【参考方案1】:

正如您控制台上的错误所暗示的那样

[WARNING] [Accordion   ] not enough space for displaying all children
[WARNING] [Accordion   ] need XXXX, got XXXXpx
[WARNING] [Accordion   ] layout aborted.

只要增加 Accordian 的空间,它就可以容纳所有的孩子

将代码的第 19 行更改为

items = Accordion(orientation='vertical', size_hint_y=None, height=50*30)

应该可以。

在 GridLayout 中,您可以通过将 Gridlayout 的 minimum_height(由子级组合的高度计算)绑定到它的高度来执行相同的操作。

items.bind(minimum_height=items.setter('height'))

Accordian 没有这种方便的方法,所以你必须自己做。

为了使其更具动态性,您可以像这样绑定到 Accordion 的 children 属性:

item.bind(children=self.update_size)

然后像这样定义update_size::

def update_size(self, instance, value):
    # change 50 to what you want your AccordionItem height to be.
    instance.size = 50*len(instance.children)

【讨论】:

这行得通,我很感激。但是为什么另一个容器不需要这个,有没有办法让它更有活力呢?我并不是要听起来忘恩负义,我很感激这一点。 更新了答案以包含解释,基本上你通过将它的高度绑定到它的 minimum_height 来对 GridLayout 做同样的事情。

以上是关于Kivy ScrollView+手风琴错误的主要内容,如果未能解决你的问题,请参考以下文章

我正在使用 Kivy 开发一个 Android 应用程序,我想知道如何在 Scrollview 中添加 MDCard?目前我正在使用 kivyMD 和 Kivy

Kivy:为啥 ScrollView 不能在 GridLayout 中工作?

如何在 Python/Kivy 中实现 ScrollView

没有为kivy获取ScrollView

如何在 SwiftUI 的 ScrollView 中制作动画? SwiftUI 中的手风琴风格动画

Kivy:将 ScrollView 移动到某个 y