2014-10-11 8 views
2

У меня другая проблема в моем проекте с 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() 
+0

В чем проблема? – Totem

+0

Я хочу сделать выборный вид с помощью 49 кнопок, нажимайте каждый элемент (кнопку), экранный переключатель, чтобы ссылаться на экран. –

ответ

4

The 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() 
+0

Это точный ответ на мой вопрос, спасибо большое !!! :) –

+0

Рад помочь. Но если это действительно то, что вы ищете, пожалуйста, примите ответ – tiktok

Смежные вопросы