如何使用on_enter事件在kivy上换屏?
How to use on_enter event to change screens on kivy?
所以,这就是我想要做的:当进入我的应用程序的第一个屏幕时,我希望它检查给定目录中是否存在某些文件。如果它们存在,我希望它立即切换到另一个屏幕。
我试过以下方法:
main.py
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from os import listdir
class Manager(ScreenManager):
pass
class CreateFileScreen(Screen):
def on_enter(self):
try:
files = listdir("data/files")
if "file.dat" in files:
self.parent.current = "login"
else:
pass
except FileNotFoundError:
pass
class LoginScreen(Screen):
pass
class ExampleApp(App):
def build(self):
return Manager()
if __name__ == "__main__":
ExampleApp().run()
example.kv
#:kivy 1.10.0
<CreateFileScreen>:
BoxLayout:
Label:
text: "This is Create File Screen"
font_size: "30sp"
<LoginScreen>:
BoxLayout:
Label:
text: "This is Login Screen"
font_size: "30sp"
<Manager>:
CreateFileScreen:
name: "createfile"
LoginScreen:
name: "login"
当 file.dat
确实存在于 data/files
中时,我收到以下错误:
kivy.uix.screenmanager.ScreenManagerException:没有名称为 "login" 的屏幕。
知道如何解决这个问题吗?
问题是 on_enter
在屏幕获取其名称之前执行。
您可以制作一个 change_screen
方法,然后用 Clock.schedule_once
调用它。这样它将被称为下一帧。
from kivy.clock import Clock
class CreateFileScreen(Screen):
def on_enter(self):
Clock.schedule_once(self.change_screen)
def change_screen(self, dt):
try:
files = listdir("data/files")
if "file.dat" in files:
self.manager.current = "login"
else:
pass
except Exception as e:
print(e)
所以,这就是我想要做的:当进入我的应用程序的第一个屏幕时,我希望它检查给定目录中是否存在某些文件。如果它们存在,我希望它立即切换到另一个屏幕。
我试过以下方法:
main.py
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from os import listdir
class Manager(ScreenManager):
pass
class CreateFileScreen(Screen):
def on_enter(self):
try:
files = listdir("data/files")
if "file.dat" in files:
self.parent.current = "login"
else:
pass
except FileNotFoundError:
pass
class LoginScreen(Screen):
pass
class ExampleApp(App):
def build(self):
return Manager()
if __name__ == "__main__":
ExampleApp().run()
example.kv
#:kivy 1.10.0
<CreateFileScreen>:
BoxLayout:
Label:
text: "This is Create File Screen"
font_size: "30sp"
<LoginScreen>:
BoxLayout:
Label:
text: "This is Login Screen"
font_size: "30sp"
<Manager>:
CreateFileScreen:
name: "createfile"
LoginScreen:
name: "login"
当 file.dat
确实存在于 data/files
中时,我收到以下错误:
kivy.uix.screenmanager.ScreenManagerException:没有名称为 "login" 的屏幕。
知道如何解决这个问题吗?
问题是 on_enter
在屏幕获取其名称之前执行。
您可以制作一个 change_screen
方法,然后用 Clock.schedule_once
调用它。这样它将被称为下一帧。
from kivy.clock import Clock
class CreateFileScreen(Screen):
def on_enter(self):
Clock.schedule_once(self.change_screen)
def change_screen(self, dt):
try:
files = listdir("data/files")
if "file.dat" in files:
self.manager.current = "login"
else:
pass
except Exception as e:
print(e)