Как связать экран со списком элементов в списке Kivymd

#kivy #kivymd

#kivy #kivymd

Вопрос:

Я использую ScreenManager. Я хотел бы связать элементы в OneLineListItem с новым экраном.

Это мой KV-файл

 screen_helper = """
    ScreenManager:

       GroupsScreen:
       MyGroupScreen:

<GroupsScreen>:
name: 'groups'
ScrollView:
    MDList:
        id: container_groups
        
<MyGroupScreen>:
name: 'my_group'
ScrollView:
    MDList:
        id: container_group

MDRectangleFlatButton:
    text: 'Back'
    pos_hint: {'center_x':0.5,'center_y':0.1}
    on_press: root.manager.current = 'groups'                    
  

и это файл python

  class GroupsScreen(Screen):
     def on_enter(self, *args):
          for i in range(5):
              item = OneLineListItem(text='Gruppo '   str(i))
              self.ids.container_groups.add_widget(item)





 class MyGroupScreen(Screen):
     pass

 sm = ScreenManager()
 sm.add_widget(GroupsScreen(name='groups'))
 sm.add_widget(MyGroupScreen(name='my_group'))

 class DemoApp(MDApp):

    def build(self):
        self.theme_cls.primary_palette = "Red"
        self.theme_cls.primary_hue = "500"
        screen = Builder.load_string(screen_helper)
        return screen
  

Я хотел бы щелкнуть элемент на экране групп и перейти к MyGroupScreen.

Ответ №1:

OneLineListItem Класс фактически расширяется ButtonBehavior , поэтому вы можете рассматривать его как Button . Просто назначьте on_press on_release метод or для OneLineListItem :

 class GroupsScreen(Screen):
    def on_kv_post(self, *args):
        for i in range(5):
            item = OneLineListItem(text='Gruppo '   str(i))
            item.on_release = self.switch_to_my_groups
            self.ids.container_groups.add_widget(item)

    def switch_to_my_groups(self, *args):
        self.manager.current = 'my_group'
  

Я изменил ваш on_enter() метод на a on_kv_post() , чтобы убедиться, что kv правила были выполнены (чтобы ids они были доступны).

Еще одна проблема — строки:

  sm = ScreenManager()
 sm.add_widget(GroupsScreen(name='groups'))
 sm.add_widget(MyGroupScreen(name='my_group'))
  

Эти строки следует удалить. Они пытаются создать графический интерфейс, а затем результат не используется. Строка:

 screen = Builder.load_string(screen_helper)
  

затем снова перестраивает графический интерфейс, и на этот раз он действительно используется.

Комментарии:

1. Спасибо за ответ. Метод on_release работает правильно для задачи, оставляя метод on_enter(). Если я использую on_kv_post(), возникает ошибка: «‘ ValueError: KivyMD: объект приложения должен быть инициализирован перед загрузкой корневого виджета. «‘.