我需要帮助调试 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
,而不是进行相反的更改。
我对使用 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
,而不是进行相反的更改。