我需要帮助调试 kivy 屏幕管理器代码

I need help debugging kivy screen manager code

我对使用 kivy 还很陌生,我正在尝试使用屏幕管理器创建一个多屏幕应用程序。我以前让应用程序工作,但我可以在屏幕之间导航的唯一方法是通过 .kv 文件中存在的代码,而不是应用程序的 .py 文件。为了继续我的项目,我需要能够从 .py 文件更新当前屏幕。

下面是我的代码副本(.py 文件和相应的 .kv 文件),如您在 .py 文件的第 10 行和第 11 行所见,我尝试了一些代码来更新当前屏幕我在网上找的。这段代码所做的一切似乎都是让我所在的屏幕执行一个动画,就好像它正在改变屏幕一样,但它实际上并没有改变。非常欢迎修复此代码或以更有效的方式重新编写它的建议。

.py 文件

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


class SCRNLogin(Screen):
    def __init__(self, **kwargs):
        super(SCRNLogin, self).__init__(**kwargs)

    def login(self, password):
        if password == "bananas":
            self.parent.current = "second"


class SecondWindow(Screen):
    pass


class WindowManager(ScreenManager):
    pass


class AsteriaApp(MDApp):
    def build(self):
        self.icon = "Media/Images/Asteria_Icon_Blue.png"
        self.theme_cls.primary_palette = "Purple"
        self.theme_cls.accent_palette = "Pink"
        self.theme_cls.theme_style = "Light"
        sm = WindowManager()
        sm.add_widget(SCRNLogin())
        sm.add_widget(SecondWindow())
        return sm


if __name__ == "__main__":
    AsteriaApp().run()

.kv 文件

<SCRNLogin>:
    name: "login"
    BoxLayout:
        orientation: "vertical"

        MDLabel:
            text: "Password: "

        TextInput:
            id: passw
            multiline: False

        MDRaisedButton:
            text: "Submit"
            on_release:
                root.login(passw.text)
                app.root.current = "second" if passw.text == "tim" else "login"
                root.manager.transition.direction = "left"

<SecondWindow>:
    name: "second"
    BoxLayout:
        orientation: "vertical"

        MDRaisedButton:
            text: "Go Back"
            on_release:
                app.root.current = "login"
                root.manager.transition.direction = "right"

        MDSwitch:
            widget_style: "ios"

发生这种情况是因为您的 kv 代码说:

    MDRaisedButton:
        text: "Submit"
        on_release:
            root.login(passw.text)
            app.root.current = "second" if passw.text == "tim" else "login"
            root.manager.transition.direction = "left"

调用root.login()方法:

def login(self, password):
    if password == "bananas":
        self.parent.current = "second"

该方法将当前 Screen 更改为 SecondWindow(如果密码为 bananas)。然后

app.root.current = "second" if passw.text == "tim" else "login"

将当前 Screen 改回 SCRNLogin。您可能应该在一个地方或另一个地方调整您的 current Screen,而不是进行相反的更改。