python - 在 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。但是它们重叠并且无法正常工作。
解决方案
默认情况下,Screen什么都不显示:它只是一个RelativeLayout。因此,为了在第二个屏幕中显示一个Button和一个Accordion小部件,您需要将这两个小部件包含在一个布局中,例如BoxLayout。
例子
以下片段说明了使用BoxLayout
小部件来包含 aButton
和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
输出
推荐阅读
- javascript - Next.js gow 获取数据并将其传递给自定义 App 环境中的 react dom
- regex - 什么是正则表达式模式“带有数字的单词”,而不是数字本身
- node.js - Firebase 存储 - 将文件的内容作为字符串获取
- google-apps-script - 用于制作超链接的 Google 脚本(用于按钮)
- sql-server - 不同长度的 SQL SUBSTRING & PATINDEX
- haskell - 如何在haskell的列表中查找列表的长度?
- python - 如何使用 asn1tools 解码 asn1 十六进制值
- r - 有条件地改变顶点形状
- java - Launch4j exe 静默崩溃或无法执行
- r - 在 R 中将 32 位浮点栅格转换为 16 位