【问题标题】:RstDocument in kivy Accordion is blocking all interactionkivy Accordion 中的 RstDocument 阻止了所有交互
【发布时间】:2018-05-23 10:29:44
【问题描述】:

我想创建一个 Accordion,其中包含由 RstDocument 和按钮组成的内容。当 RstDocument 的内容大于给定空间时,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()

【问题讨论】:

    标签: python kivy accordion kivy-language


    【解决方案1】:

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

    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()
    

    【讨论】:

    • 感谢您的回答。似乎 Scrolling RstDocument 和 ScrollView 的组合不能一起工作。我摆脱了 RstDocument 并更改为 Label 使其变得更好。但是,仍在为 AccordionItems 的大小而苦苦挣扎。我想让 AccorionItem 固定高度,但听起来比 Kivy 处理这个更容易:(
    • AccordionItem 的高度是固定的。你的意思是要增加标题所在的 AccordionItem 框还是按钮和标签所在的高度?
    • AccordionItem 大小的问题在于绑定到 self.update_size。在上面的示例中,项目本身的大小也会受到影响——这不是我们想要的。在计算手风琴所需的高度之前,Kivy 似乎需要显式更新屏幕。所以最好通过 Kivy's Clock 进行显式调用,然后计算出需要的高度。
    【解决方案2】:

    我在 ScrollView 中遇到了与 RstDocuments 相同的问题。出现问题是因为 RstDocuments 有自己的滚动和“拦截”滚动命令,因为它认为您正在尝试在 RstDocument 内滚动。如果您对非滚动 RstDocument 没问题,您可以为 RstDocument 设置 do_scroll_y: False,然后滚动将在 ScrollView 中正常工作,无论鼠标悬停在 RstDocument 上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      相关资源
      最近更新 更多