#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: объект приложения должен быть инициализирован перед загрузкой корневого виджета. «‘.