Внедрение Аккордеона на SecondScreen в Kivy ScreenManager - PullRequest
0 голосов
/ 03 июля 2019

Я не могу разместить AccordionItem на экране Kivy ScreenManager. Для этого я должен определить что-то вроде 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. Но они перекрываются и не работают должным образом.

1 Ответ

0 голосов
/ 03 июля 2019

По умолчанию на экране ничего не отображается: это просто RelativeLayout .Поэтому, чтобы отобразить виджеты Button и Accordion на втором экране, вам нужно заключить эти два виджета в layout например BoxLayout.

Пример

В следующих фрагментах показано использование виджета BoxLayout для включения виджетов Button и Accordion.

Snippets - py file

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

Выход

Second Screen - Button & Accordion

...