Python 在kivy中创建切换到不同屏幕的按钮列表视图

Python 在kivy中创建切换到不同屏幕的按钮列表视图,python,button,screen,kivy,listitem,Python,Button,Screen,Kivy,Listitem,我和kivy的项目还有一个问题。 我有50个屏幕,我想首先显示一个按钮列表,当按下按钮时,屏幕管理器应该切换到相关屏幕。这是我的代码,但我不知道该怎么办 资料来源: 从kivy.uix.screenmanager导入screenmanager,屏幕 从kivy.lang导入生成器 从kivy.app导入应用程序 #从kivy.uix.popup导入弹出窗口 #从kivy.uix.label导入标签 从kivy.core.audio导入SoundLoader Builder.load_字符串(“

我和kivy的项目还有一个问题。 我有50个屏幕,我想首先显示一个按钮列表,当按下按钮时,屏幕管理器应该切换到相关屏幕。这是我的代码,但我不知道该怎么办

资料来源:

从kivy.uix.screenmanager导入screenmanager,屏幕
从kivy.lang导入生成器
从kivy.app导入应用程序
#从kivy.uix.popup导入弹出窗口
#从kivy.uix.label导入标签
从kivy.core.audio导入SoundLoader
Builder.load_字符串(“”)
:
盒子布局:
盒子布局:
大小提示:(.1,无)
按钮:
文字:“信用”
#按:root.show\u popup()
#列表视图:
#大小提示:.8,.9
#适配器:
#sla.simplelistatadapter(
#数据=[“项目#{0}”。范围(100)内i的格式(i),
#cls=按钮。按钮
#选择_mode='single',
#允许\u空\u选择=假)
列表视图:
大小提示:.8,.97
item_字符串:[范围(50)内索引的str(索引)]
盒子布局:
大小提示:(.1,无)
按钮:
文本:“atlas”
:
盒子布局:
盒子布局:
大小提示:(.1,无)
按钮:
文本:“菜单”
按:root.manager.current='菜单'
盒子布局:
方向:'垂直'
按钮:
正文:“标题”
大小提示:(1,.2)
图片:
来源:“/home/hosein/Pictures/1.png”
尺寸提示:(1.8)
盒子布局:
大小提示:(.1,无)
按钮:
文本:“atlas”
''')
类菜单页(屏幕):
M=SoundLoader.load('/home/hosein/Music/Man.mp3')
def播放(自我):
如果MenuPage.M.state==“停止”:
MenuPage.M.play()
其他:
MenuPage.M.停止()
课堂页面(屏幕):
通过
sm=屏幕管理器()
menu=MenuPage(name='menu')
sm.add_小部件(菜单)
对于范围(50)内的i:
姓名=页码(姓名=str(i))
sm.add_小部件(名称)
类TestApp(应用程序):
def生成(自):
返回sm
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
TestApp().run()
这50个“页面”都是相同的,因此将它们全部替换为一个页面将更有意义,该页面可根据所选菜单按钮更改图片/声音内容。它使用更少的资源,并且更容易调试和维护

通过将资源文件(例如1.png)分组到固定的子目录中或使用库()提供的间接机制在代码中引用它们,您的资源文件(例如1.png)也会得到更好的组织

关于你的问题,;listview机制允许多种不同的方法,但simpleadapter是不够的。ListView文档()中提供了很多列表的好例子

至少,您需要一个listadapter、一个响应按钮按下的函数以及该函数与按钮对象的绑定。您可以通过绑定
listadapter.on\u selection\u change
事件处理程序来实现这一点,但我发现使用特定处理程序创建按钮项类更为简洁,这就是我下面提供的内容

from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.app import App
from kivy.core.audio import SoundLoader
from kivy.uix.listview import ListItemButton
from kivy.properties import ListProperty, NumericProperty

Builder.load_string('''
#:import la kivy.adapters.listadapter
#:import factory kivy.factory

<MenuButton>:
    size_hint_y: None
    height: dp(24)
    on_release: app.on_menu_selection(self.index)

<MenuPage>:
    BoxLayout:
        BoxLayout:
            size_hint:(.1, None)
            Button:
                text: 'Credit'
                #on_press:root.show_popup()
        ListView:
            size_hint: .8,.9
            adapter:
                la.ListAdapter(
                data=app.data,
                cls=factory.Factory.MenuButton,
                selection_mode='single',
                allow_empty_selection=True,
                args_converter=root.args_converter)

        BoxLayout:
            size_hint:(.1, None)
            Button:
                text: 'atlas'


<Page>:
    BoxLayout:
        BoxLayout:
            size_hint:(.1, None)
            Button:
                text: 'MENU'
                on_press: root.manager.current = 'menu'
        BoxLayout:
            orientation:'vertical'
            Button:
                text:'Title'
                size_hint:(1, .2)
            Image:
                source: '/home/hosein/Pictures/1.png'
                size_hint:(1, .8)
        BoxLayout:
            size_hint:(.1, None)

            Button:
                text: 'atlas'
''')

class MenuButton(ListItemButton):
    index = NumericProperty(0)

class MenuPage(Screen):
    M = SoundLoader.load('/home/hosein/Music/Man.mp3')

    def plays(self):
        if MenuPage.M.state == 'stop':
            MenuPage.M.play()
        else:
            MenuPage.M.stop()

    def args_converter(self, row_index, title):
        print ("{0}={1}".format(row_index, title))

        return {
            'index': row_index,
            'text': title
        }

class Page(Screen):
    pass

class TestApp(App):
    data = ListProperty(["Item #{0}".format(i) for i in range(50)])

    def build(self):
        sm = ScreenManager()
        menu = MenuPage(name='menu')
        sm.add_widget(menu)
        for i in range(50):
            name = Page(name=str(i))
            sm.add_widget(name)
        return sm

    def on_menu_selection(self, index):
        self.root.current = str(index)

if __name__ == '__main__':
    TestApp().run()
从kivy.uix.screenmanager导入screenmanager,屏幕
从kivy.lang导入生成器
从kivy.app导入应用程序
从kivy.core.audio导入SoundLoader
从kivy.uix.listview导入ListItemButton
从kivy.properties导入ListProperty、NumericProperty
Builder.load_字符串(“”)
#:导入la kivy.adapters.listadapter
#:进口工厂kivy.factory
:
尺寸提示:无
高度:dp(24)
发布时:应用程序菜单选择(自索引)
:
盒子布局:
盒子布局:
大小提示:(.1,无)
按钮:
文字:“信用”
#按:root.show\u popup()
列表视图:
大小提示:.8,.9
适配器:
莱斯特(
数据=应用程序数据,
cls=factory.factory.MenuButton,
选择_mode='single',
允许\u空\u选择=真,
args\u converter=root.args\u converter)
盒子布局:
大小提示:(.1,无)
按钮:
文本:“atlas”
:
盒子布局:
盒子布局:
大小提示:(.1,无)
按钮:
文本:“菜单”
按:root.manager.current='菜单'
盒子布局:
方向:'垂直'
按钮:
正文:“标题”
大小提示:(1,.2)
图片:
来源:“/home/hosein/Pictures/1.png”
尺寸提示:(1.8)
盒子布局:
大小提示:(.1,无)
按钮:
文本:“atlas”
''')
类菜单按钮(ListItemButton):
索引=数值属性(0)
类菜单页(屏幕):
M=SoundLoader.load('/home/hosein/Music/Man.mp3')
def播放(自我):
如果MenuPage.M.state==“停止”:
MenuPage.M.play()
其他:
MenuPage.M.停止()
def参数转换器(自身、行索引、标题):
打印(“{0}={1}”。格式(行索引,标题))
返回{
“索引”:行索引,
“文本”:标题
}
课堂页面(屏幕):
通过
类TestApp(应用程序):
数据=ListProperty([“项{0}”。范围(50)中i的格式(i))
def生成(自):
sm=屏幕管理器()
menu=MenuPage(name='menu')
sm.add_小部件(菜单)
对于范围(50)内的i:
姓名=页码(姓名=str(i))
sm.add_小部件(名称)
返回sm
菜单上的def选项(自身、索引):
self.root.current=str(索引)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
TestApp().run()

到底是什么问题?我想用49个按钮创建可选视图,按下屏幕开关管理器指向屏幕的每个项目(按钮)。很高兴提供帮助。但是如果它真的是你想要的,那么请接受答案它工作,但我想改变listview图标按钮的背景色
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.app import App
from kivy.core.audio import SoundLoader
from kivy.uix.listview import ListItemButton
from kivy.properties import ListProperty, NumericProperty

Builder.load_string('''
#:import la kivy.adapters.listadapter
#:import factory kivy.factory

<MenuButton>:
    size_hint_y: None
    height: dp(24)
    on_release: app.on_menu_selection(self.index)

<MenuPage>:
    BoxLayout:
        BoxLayout:
            size_hint:(.1, None)
            Button:
                text: 'Credit'
                #on_press:root.show_popup()
        ListView:
            size_hint: .8,.9
            adapter:
                la.ListAdapter(
                data=app.data,
                cls=factory.Factory.MenuButton,
                selection_mode='single',
                allow_empty_selection=True,
                args_converter=root.args_converter)

        BoxLayout:
            size_hint:(.1, None)
            Button:
                text: 'atlas'


<Page>:
    BoxLayout:
        BoxLayout:
            size_hint:(.1, None)
            Button:
                text: 'MENU'
                on_press: root.manager.current = 'menu'
        BoxLayout:
            orientation:'vertical'
            Button:
                text:'Title'
                size_hint:(1, .2)
            Image:
                source: '/home/hosein/Pictures/1.png'
                size_hint:(1, .8)
        BoxLayout:
            size_hint:(.1, None)

            Button:
                text: 'atlas'
''')

class MenuButton(ListItemButton):
    index = NumericProperty(0)

class MenuPage(Screen):
    M = SoundLoader.load('/home/hosein/Music/Man.mp3')

    def plays(self):
        if MenuPage.M.state == 'stop':
            MenuPage.M.play()
        else:
            MenuPage.M.stop()

    def args_converter(self, row_index, title):
        print ("{0}={1}".format(row_index, title))

        return {
            'index': row_index,
            'text': title
        }

class Page(Screen):
    pass

class TestApp(App):
    data = ListProperty(["Item #{0}".format(i) for i in range(50)])

    def build(self):
        sm = ScreenManager()
        menu = MenuPage(name='menu')
        sm.add_widget(menu)
        for i in range(50):
            name = Page(name=str(i))
            sm.add_widget(name)
        return sm

    def on_menu_selection(self, index):
        self.root.current = str(index)

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