Python 在kivy中创建切换到不同屏幕的按钮列表视图
我和kivy的项目还有一个问题。 我有50个屏幕,我想首先显示一个按钮列表,当按下按钮时,屏幕管理器应该切换到相关屏幕。这是我的代码,但我不知道该怎么办 资料来源: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.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()