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






По умолчанию Экран ничего не отображает: это просто RelativeLayout. Следовательно, чтобы отобразить виджеты Кнопка и Аккордеон на втором экране, вам необходимо заключить эти два виджета в макет, например. BoxLayout.
Следующие фрагменты иллюстрируют использование виджета BoxLayout для включения виджетов Button и Accordion.
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