kivy手风琴中的RstDocument阻止了所有互动

时间:2017-12-09 08:42:20

标签: python kivy accordion kivy-language

我想创建一个包含由RstDocument和按钮组成的内容的Accordion。当此内容大于给定空间时,Accordion应该是可滚动的以及RstDocument的内容。所以我提出了以下代码,但在对AccordionItems进行一些点击后,所有进一步的交互都是阻塞的。我在这里做错了什么?

from kivy.app import App
from kivy.uix.scrollview import ScrollView
from kivy.uix.rst import RstDocument
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.accordion import Accordion, AccordionItem
from kivy.uix.button import Button

class ShowrstApp (App):

    def update_size(self, instance, *args):
        instance.size = 60 * len(instance.children)

    def build (self):
        numitems = 10

        root = BoxLayout()
        accheight = numitems * 60
        accitems = Accordion(id='acc_panel', orientation='vertical', pos_hint={'top': 1}, size_hint_y=None,
                            height=accheight, md_bg_color=(1, 1, 1, 1))

        for i in xrange(numitems):
            item = AccordionItem(title='This is item: %d' % i)
            somecontent = BoxLayout(orientation='vertical')
            somecontent.add_widget(RstDocument(text='Some nicely formatted text here'))
            somecontent.add_widget(Button(text='click here', height=(42), size_hint=(1,None)))
            item.add_widget(somecontent)
            item.bind(children=self.update_size)
            accitems.add_widget(item)
        sv = ScrollView(do_scroll_x = False)
        sv.add_widget(accitems)

        root.add_widget(sv)
        return root

Window.size = (350,650)
showrst = ShowrstApp()
showrst.run()

2 个答案:

答案 0 :(得分:0)

当滚动效果在RstDocument Boxlayout水平垂直时起作用,但是我看到的问题是当BoxLayout设置为垂直时,每个项目的切换都是静音的,你必须逐个从自下而上。这很奇怪。您可以单击每个AccordionItem,而RstDocument不是。这应该是一个很好的起点。注意到使用Label时不会发生这种效果,因此这可能是另一种选择。

from kivy.app import App
from kivy.uix.scrollview import ScrollView
from kivy.uix.rst import RstDocument
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.accordion import Accordion, AccordionItem
from kivy.uix.button import Button

class ShowrstApp (App):

    def update_size(self, instance, *args):
        instance.height = 100 * len(instance.children) # set Accordion height to the number of accordionItem times the height accordionItem height

    def build (self):
        numitems = 10

        root = BoxLayout()
        accheight = numitems * 60
        accitems = Accordion(id='acc_panel', orientation='vertical', size_hint_y=None, pos_hint={'top':1}
                            height=accheight, md_bg_color=(1, 1, 1, 1))

        for i in xrange(numitems * 2): # *2 to show it works
            item = AccordionItem(title='This is item: %d' % i)
            somecontent = BoxLayout(orientation = 'horizontal') # couldn't solve an issue I notice so I used horizontal
            somecontent.add_widget(RstDocument(text='Some nicely formatted text here' * 10))
            somecontent.add_widget(Button(text='click here', height=(42), size_hint=(1,None)))
            item.add_widget(somecontent)
            accitems.bind(size=self.update_size)
            accitems.add_widget(item)
        sv = ScrollView(do_scroll_x = False)
        sv.add_widget(accitems)

        root.add_widget(sv)
        return root


Window.size = (350,650)
showrst = ShowrstApp()
showrst.run()

答案 1 :(得分:0)

我在ScrollView中遇到RstDocuments的相同问题。出现问题是因为RstDocuments拥有自己的滚动功能,并且“拦截”了scroll命令,因为它认为您正在尝试在RstDocument内滚动。如果您适合非滚动RstDocument,则可以为RstDocument设置do_scroll_y: False,然后滚动即可在ScrollView中正常运行,而不必将鼠标悬停在RstDocument上。

相关问题