Как использовать событие 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)
Другие вопросы по тегам