进行切换到kivy中不同屏幕的按钮的列表视图
我的项目中有另外一个问题与kivy。 我有50个屏幕,我想先显示引用屏幕的按钮列表当按下按钮时,屏幕管理者应该切换到相关屏幕。这是我的代码,但我不知道该怎么办!进行切换到kivy中不同屏幕的按钮的列表视图
来源: https://gist.github.com/daryasary/3a2be816c1f35b748866
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.app import App
#from kivy.uix.popup import Popup
#from kivy.uix.label import Label
from kivy.core.audio import SoundLoader
Builder.load_string('''
<MenuPage>:
BoxLayout:
BoxLayout:
size_hint:(.1, None)
Button:
text: 'Credit'
#on_press:root.show_popup()
#ListView:
#size_hint: .8,.9
#adapter:
#sla.SimpleListAdapter(
#data=["Item #{0}".format(i) for i in range(100)],
#cls=button.Button
#selection_mode='single',
#allow_empty_selection=False)
ListView:
size_hint: .8, .97
item_strings: [str(index) for index in range(50)]
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 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()
class Page(Screen):
pass
sm = ScreenManager()
menu = MenuPage(name='menu')
sm.add_widget(menu)
for i in range(50):
name = Page(name=str(i))
sm.add_widget(name)
class TestApp(App):
def build(self):
return sm
if __name__ == '__main__':
TestApp().run()
50“页”都是相同的,因此会更有意义与变化取决于所选择的菜单按钮的图像/声音内容的单页全部更换。它使用更少的资源并且更容易调试和维护。
你的资源文件(例如1.png)也将更好或者通过将它们分组在固定的子目录或使用该库(link)
关于你的问题所提供的间接机制指的是他们在组织代码; listview机制允许一些不同的方法,但是简单适配器是不够的。 ListView文档中提供了很多很好的示例列表(link)
至少需要一个listadapter,一个响应按钮按下的函数以及该函数与按钮对象的绑定。你可以通过绑定listadapter.on_selection_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()
这是我的问题的确切答案,非常感谢! :) – 2014-10-27 17:47:59
很高兴帮助。但如果它真的是你想要的,那么请接受答案 – tiktok 2014-10-28 21:04:57
究竟是什么问题? – Totem 2014-10-12 23:43:04
我想用49个按钮进行可选择的视图,按下每个项目(按钮)屏幕切换管理器参照屏幕。 – 2014-10-14 07:28:23