Kivy Accordion:没有足够的空间警告

问题描述 投票:0回答:1

我正在尝试使用Kivy和Python 3.7在1366x768显示器中制作基于手风琴的菜单(如果它有所不同)。代码似乎工作正常,因为我得到了所需的输出。但是,我收到警告,说明手风琴中的所有儿童都没有足够的空间(我猜),布局将会中止,但事实并非如此:所有东西都是用足够的空间绘制的。虽然这不是一个严重的问题,因为一切都显示出预期,但我要么缺少一些明显的东西,要么对于kivy如何生成屏幕元素有误解。所以,如果你能澄清这一点(并希望摆脱丑陋的警告),我会非常感激它!

以下是代码的简化版本,全部采用纯python(我希望保持这种方式,这不是一个复杂的程序)。我只是制作一个外部的BoxLayout,在里面我将一个内部的GridLayout与手风琴下面的按钮放在一起。请注意,我已将kivy设置为以最大化窗口运行,代码中包含此设置。

起初我以为它可能与订单kivy处理项目或其他东西有关:它可能首先检查标签和假设默认size_hint =(1,1)的按钮并认为它没有空间,但是然后能够绘制它们感谢自定义size_hint。然而,当将其改为(1,1)时,我得到了相同的警告,同时仍然可以利用空间绘制所有内容(尽管不是很多)。尽管如此,它确实略微改变了警告,因为它显示了更严格的限制警告。

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.accordion import Accordion, AccordionItem
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.app import App

from kivy.config import Config


class TestApp(App):
    def build(self):
        layout = BoxLayout(orientation="vertical")

        inner_layout = GridLayout(cols=3)
        inner_layout.add_widget(Label(text="Section 1", size_hint=(1, 0.09), font_size='20dp'))
        inner_layout.add_widget(Label(text="Section 2", size_hint=(1, 0.09), font_size='20dp'))
        inner_layout.add_widget(Label(text="Section 3", size_hint=(1, 0.09), font_size='20dp'))

        accord1 = Accordion(orientation="vertical")
        accord1.add_widget(AccordionItem(title="Item 1"))
        accord1.add_widget(AccordionItem(title="Item 2"))

        accord2 = Accordion(orientation="vertical")
        accord2.add_widget(AccordionItem(title="Item 1"))

        accord3 = Accordion(orientation="vertical")
        accord3.add_widget(AccordionItem(title="Item 1"))
        accord3.add_widget(AccordionItem(title="Item 2"))
        accord3.add_widget(AccordionItem(title="Item 3"))

        inner_layout.add_widget(accord1)
        inner_layout.add_widget(accord2)
        inner_layout.add_widget(accord3)

        layout.add_widget(inner_layout)

        continue_btn = Button(text="START", size_hint=(1, 0.07))
        layout.add_widget(continue_btn)

        return layout


if __name__ == "__main__":
    # Three lines to ensure non-fullscreen, maximized window on launch
    Config.set('graphics', 'fullscreen', 0)
    Config.set('graphics', 'borderless', 0)
    Config.set('graphics', 'window_state', 'maximized')

    Config.write()

    TestApp().run()

这是我用显示的代码得到的警告:

[WARNING] [Accordion   ] not enough space for displaying all children
[WARNING] [Accordion   ] need 132px, got 91px
[WARNING] [Accordion   ] layout aborted.

虽然这些是将所有size_hint值更改为默认值(1,1)所导致的:

[WARNING] [Accordion   ] not enough space for displaying all children
[WARNING] [Accordion   ] need 88px, got 50px
[WARNING] [Accordion   ] layout aborted.
[WARNING] [Accordion   ] not enough space for displaying all children
[WARNING] [Accordion   ] need 132px, got 50px
[WARNING] [Accordion   ] layout aborted.
python python-3.x layout kivy accordion
1个回答
0
投票

您收到警告的原因是Accordion小部件在设置实际大小之前运行其布局代码(Accordion正常)。请注意,消息显示need 132px。这是因为每个项目的默认最小大小是44,而你的accord3有3个孩子(3次44是132)。它还说got 91px。这是因为父GridLayout的初始大小是100乘100(对于所有小部件都是如此),Section 3 Label占0.09(或9px),为Accordion留下91px。由于91小于132,因此决定没有足够的空间。正确,但在此之后不久,使用正确的值再次调用布局代码,一切都很好。如果该代码的作者可以消除那些毫无意义的警告,那就太好了。

因此,在Accordion确定其实际大小之后,您可以通过不将GridLayout小部件添加到布局来避免这些警告。要做到这一点,你可以使用Clock.schedule_once()。以下是使用该方法修改TestApp

class TestApp(App):
    def build(self):
        layout = BoxLayout(orientation="vertical")

        self.inner_layout = GridLayout(cols=3)
        self.inner_layout.add_widget(Label(text="Section 1", size_hint=(1, 0.09), font_size='20dp'))
        self.inner_layout.add_widget(Label(text="Section 2", size_hint=(1, 0.09), font_size='20dp'))
        self.inner_layout.add_widget(Label(text="Section 3", size_hint=(1, 0.09), font_size='20dp'))

        layout.add_widget(self.inner_layout)

        continue_btn = Button(text="START", size_hint=(1, 0.07))
        layout.add_widget(continue_btn)

        Clock.schedule_once(self.add_accordions)

        return layout

    def add_accordions(self, dt):

        accord1 = Accordion(orientation="vertical")
        accord1.add_widget(AccordionItem(title="Item 1"))
        accord1.add_widget(AccordionItem(title="Item 2"))

        accord2 = Accordion(orientation="vertical")
        accord2.add_widget(AccordionItem(title="Item 1"))

        accord3 = Accordion(orientation="vertical")
        accord3.add_widget(AccordionItem(title="Item 1"))
        accord3.add_widget(AccordionItem(title="Item 2"))
        accord3.add_widget(AccordionItem(title="Item 3"))

        self.inner_layout.add_widget(accord1)
        self.inner_layout.add_widget(accord2)
        self.inner_layout.add_widget(accord3)
© www.soinside.com 2019 - 2024. All rights reserved.