Как использовать событие on_enter для смены экранов на киве?
Итак, вот что я пытаюсь сделать: при входе на первый экран моего приложения я хочу, чтобы он проверял, существуют ли какие-либо файлы в данном каталоге. Если они существуют, я хочу, чтобы он немедленно переключился на другой экран.
Я пробовал следующее:
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: Нет экрана с именем "логин".
Есть идеи, как это исправить?
1 ответ
Решение
Проблема в том, что 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)