Неверные данные после объявления — KivyMD

#python-3.x #kivy #kivymd

Вопрос:

Я пытаюсь использовать список KivyMD в качестве кнопки, т. Е. При нажатии на список KivyMD пользователи переходят на другой экран, но я продолжаю получать ошибку «Недопустимые данные после объявления».

Пожалуйста, соблюдайте мой код на предмет любых аномалий, которые могут быть причиной этого..

вот мой main.py файл

 from kivymd.app import MDApp
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition

from kivy.core.window import Window

Window.size = (300, 500)


class IntroScreen(Screen):
    pass


class SuccessScreen(Screen):
    pass


class SearchScreen(Screen):
    pass


class MenuScreen(Screen):
    pass


class GettingStartedScreen(Screen):
    pass


class ProjectApp(MDApp):
    def build(self):
        self.sm = ScreenManager(transition=NoTransition())
        self.sm.add_widget(IntroScreen(name="intro_screen"))
        self.sm.add_widget(GettingStartedScreen(name="getting_started_screen"))
        self.sm.add_widget(SuccessScreen(name="success_screen"))
        self.sm.add_widget(SearchScreen(name='search_screen'))
        self.sm.add_widget(MenuScreen(name="menu_screen"))

        return self.sm

    def change_screen(self, screen, *kwargs):
        self.sm.current = "intro_screen"
        self.sm.current = "getting_started_screen"
        self.sm.current = "success_screen"
        self.sm.current = "search_screen"
        self.sm.current = "menu_screen"
        self.sm.current = screen


ProjectApp().run()
 

И вот мой файл .kv

 ScreenManager:

<IntroScreen>
    name: "intro_screen"

    FloatLayout:

# """Secondly, please is there a way to make MDCard auto
# resize automatically on any screen"""
        MDCard:
            orientation: 'vertical'
            padding: 16
            size_hint: None, None
            size: "280dp", "360dp"
            pos_hint: {"center_x": .5, "center_y": .6}
            elevation: 8
            orientation: 'vertical'
            radius: 15

            ScrollView:
                MDList:
                    OneLineIconListItem:
                        text: "WHAT IS KETO DIET"
                        IconLeftWidget:
                           icon: "cash-multiple"
                    OneLineIconListItem:
                        text: "WHY TRY KETO DIET"
                        IconLeftWidget:
                            icon: "cash-100"
                    OneLineIconListItem:
                        text: "IS KETO RIGHT FOR YOU"
                        IconLeftWidget:
                            icon: "cash-marker"
                    OneLineIconListItem:
                        text: "GETTING STARTED"
                        IconLeftWidget:
                            icon: "cash"
                        on_touch_down: app.root.current = "getting_started_screen" #I THINK THIS IS WHERE THE INVALID DATA ERROR OCCURS

        MDBottomAppBar:
            MDToolbar:
                icon: "arm-flex-outline"
                type: 'bottom'
                mode: 'center'
                left_action_items: [["calendar-text", lambda x: x], ["account-group", lambda x: app.change_screen("success_screen")]]
                right_action_items: [["magnify", lambda x: app.change_screen("search_screen")], ["menu", lambda x: app.change_screen("menu_screen")]]

<GettingStartedScreen>
    name: "getting_started_screen"

    FloatLayout:
        MDCard:
            orientation: "vertical"
            elevation: 10
            radius: 10
            OneLineIconListItem:
                text: "WHAT TO KNOW BEFORE STARTING"
                IconLeftWidget:
                    icon: "cash"
            OneLineIconListItem:
                text: "WHAT TO DO BEFORE STARTING"
                IconLeftWidget:
                    icon: "cash"
            OneLineIconListItem:
                text: "HOW TO START THE KETO DIET"
                IconLeftWidget:
                    icon: "cash"
            OneLineIconListItem:
                text: "FREQUENTLY ASKED QUESTIONS"
                IconLeftWidget:
                    icon: "cash"


<SuccessScreen>
    name: "success_screen"

    BoxLayout:
        orientation: "vertical"

        MDBottomAppBar:
            MDToolbar:
                icon: "magnify"
                on_action_button: app.change_screen("search_screen") 
                type: 'bottom'
                mode: 'center'
                left_action_items: [["calendar-text", lambda x: app.change_screen("intro_screen")], ["account-group", lambda x: x]]
                right_action_items: [["magnify", lambda x: app.change_screen("search_screen")], ["menu", lambda x: app.change_screen("menu_screen")]]

<SearchScreen>
    name: 'search_screen'

    BoxLayout:
        orientation: 'vertical'

        MDBottomAppBar:
            MDToolbar:
                icon: "window-close"
                type: "bottom"
                mode: "center"
                left_action_items: [["calendar-text", lambda x: app.change_screen("intro_screen")], ["account-group", lambda x: app.change_screen("success_screen")]]
                right_action_items: [["magnify", lambda x: x], ["menu", lambda x: app.change_screen("menu_screen")]]

<MenuScreen>
    name: "menu_screen"

    BoxLayout:
        orientation: "vertical"

        MDBottomAppBar:
            MDToolbar:
                icon: "reload"
                type: "bottom"
                mode: "center"
                left_action_items: [["calendar-text", lambda x: app.change_screen("intro_screen")], ["account-group", lambda x: app.change_screen("success_screen")]]
                right_action_items: [["magnify", lambda x: app.change_screen("search_screen")], ["menu", lambda x: x]]
 

Заранее большое спасибо… Пожалуйста, я оставил комментарий, где, по моему мнению, возникает эта ошибка.. А во-вторых, как мне сделать MDCard, чтобы в .kv файле автоматически изменялся размер только по размеру экрана.. Еще раз заранее спасибо..

Ответ №1:

Это OneLineIconListItem тип Button , поэтому вы можете просто добавить on_release атрибут.:

             MDList:
                OneLineIconListItem:
                    text: "WHAT IS KETO DIET"
                    IconLeftWidget:
                        icon: "cash-multiple"
                OneLineIconListItem:
                    text: "WHY TRY KETO DIET"
                    IconLeftWidget:
                        icon: "cash-100"
                OneLineIconListItem:
                    text: "IS KETO RIGHT FOR YOU"
                    IconLeftWidget:
                        icon: "cash-marker"
                OneLineIconListItem:
                    text: "GETTING STARTED"
                    on_release:
                        app.root.current = "getting_started_screen"
                    IconLeftWidget:
                        icon: "cash"
 

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

1. Большое спасибо, Джон, это наконец сработало, проблема теперь в том, что каждый список MDL выводит меня на один и тот же экран, но я хочу, чтобы каждый список MDL выводил меня на другой экран, пожалуйста, как это исправить.

2. Я неправильно понял ваш вопрос, я думал, что это то, чего вы хотели. Это OneLineIconListItem тип Button , поэтому вы можете просто добавить on_release атрибут. Смотрите мой обновленный ответ.