【问题标题】:Invalid data after declaration - KivyMD声明后数据无效 - KivyMD
【发布时间】:2021-07-31 23:48:10
【问题描述】:

我正在尝试将 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 文件中仅根据屏幕大小自动调整大小..再次感谢前进..

【问题讨论】:

    标签: python-3.x kivy kivymd


    【解决方案1】:

    OneLineIconListItemButton 的一种类型,因此您只需添加一个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"
    

    【讨论】:

    • 非常感谢约翰,终于成功了,现在的问题是每个 MDList 都将我带到同一个屏幕,但我希望每个 MDList 都将我带到不同的屏幕,请问如何我要解决这个问题吗?
    • 我误解了你的问题,我以为这就是你想要的。 OneLineIconListItemButton 的一种类型,因此您只需添加on_release 属性即可。请参阅我的更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2014-07-20
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多