首页 > 解决方案 > 在 Kivy ScreenManager 中实现手风琴到 SecondScreen

问题描述

我无法在 Kivy ScreenManager 的屏幕上放置 AccordionItem。为此,我必须定义类似 root = Accordion() 的东西。但我不知道 ScreenLayout 是在哪里定义的。我用纯 python 构建它,因为我对 Kivy 完全陌生,但对 python 并不陌生。

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import ScreenManager, Screen

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



class ScreenOne(Screen):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)


        btn1 = Button(
            text='change screen',
            size_hint=(.5, .05),
            pos_hint={'left':0, 'top':1}
            )
        btn1.bind(on_press=self.changer)
        self.add_widget(btn1)


    def changer(self,*args):

        self.manager.current = 'screen2'

    def test(self,instance):
        print('This is a test')


class ScreenTwo(Screen):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        btn2 = Button(
            text='change screen',
            size_hint=(.5, .25),
            pos_hint={'left':0, 'top':1}
            )
        btn2.bind(on_press=self.changer)
        self.add_widget(btn2)


        title = ["Title 1", "Title 2","Title 3","Title 4","Title 5"]


        for x in range(5):

            item = AccordionItem(title= title[x])
            item.add_widget(Label(text='Very big content\n' * 10))
            self.add_widget(item)

        return sm



    def changer(self,*args):
        self.manager.current = 'screen1'

    def test(self,instance):
        print('This is another test')


class TestApp(App):

    def build(self):


        sm = ScreenManager()

        sc1 = ScreenOne(name='screen1')
        sc2 = ScreenTwo(name='screen2')        

        sm.add_widget(sc1)
        sm.add_widget(sc2)

        print (sm.screen_names)

        return sm




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

ScreenTwo 应该显示 5 个 AccordionItems。但是它们重叠并且无法正常工作。

标签: pythonpython-3.xkivykivy-language

解决方案


默认情况下,Screen什么都不显示:它只是一个RelativeLayout。因此,为了在第二个屏幕中显示一个Button和一个Accordion小部件,您需要将这两个小部件包含在一个布局中,例如BoxLayout

例子

以下片段说明了使用BoxLayout小部件来包含 aButtonAccordion小部件。

片段 - py 文件

from kivy.uix.boxlayout import BoxLayout

...

class ScreenTwo(Screen):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        layout = BoxLayout(orientation='vertical')    # instantiate BoxLayout
        self.add_widget(layout)    # add BoxLayout to screen

        btn2 = Button(
            text='change screen',
            size_hint=(.5, .05),
        )
        btn2.bind(on_press=self.changer)
        layout.add_widget(btn2)    # add Button to BoxLayout

        title = ["Title 1", "Title 2", "Title 3", "Title 4", "Title 5"]

        accordion = Accordion()    # instantiate Accordion
        layout.add_widget(accordion)    # add Accordion to BoxLayout

        for x in range(5):
            item = AccordionItem(title=title[x])
            item.add_widget(Label(text='Very big content\n' * 10))
            accordion.add_widget(item)    # add AccordionItem to Accordion

输出

第二个屏幕 - 按钮和手风琴


推荐阅读