Реализовать Accordion для SecondScreen в Kivy ScreenManager

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По умолчанию Экран ничего не отображает: это просто RelativeLayout. Следовательно, чтобы отобразить виджеты Кнопка и Аккордеон на втором экране, вам необходимо заключить эти два виджета в макет, например. BoxLayout.

Пример

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

Фрагменты — 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

Выход

Second Screen - Button & Accordion

Другие вопросы по теме