Как создать заставку в Kivy с (или без) ScreenManager, который автоматически переключается на следующий экран? - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь создать "SplashScreen" с python и kivy.Идея состоит в том, чтобы запустить программу, показать SplashScreen как можно быстрее, запустить некоторые методы в фоновом режиме, а затем автоматически переключиться на «MainScreen».Это первый момент, когда пользовательский ввод возможен и ожидаем.

Проблема в том, что каждый раз, когда я пытался, я получал следующий результат: программа запускается, показывает пустое белое окно, запускает мои методы, показывает SplashScreen, немедленно переключается на MainScreen.

Я просто не понимаю, как заставить kivy показать SplashScreen перед запуском нужных мне методов.Чтобы прояснить это: «SplashScreen» не означает необычную фантазию, такую ​​как прозрачность или что-то в этом роде.Просто еще один стандартный экран.

Вот мой код:

mainWindow.py

Builder.load_file("loadingscreen.kv")
Builder.load_file("mainscreen.kv")

class LoadingScreen(Screen):
    pass


class MainScreen(Screen):
    pass


class FaitApp(App):

    LoadingStartUp = None

    def build(self):
        self.root = ScreenManager()
        self.root.add_widget(LoadingScreen(name='LoadingScreen'))
        self.root.add_widget(MainScreen(name='MainScreen'))
        return self.root

    def on_start(self):
        self.LoadingStartUp = LoadingStartUp(self)
        Clock.schedule_once(self.LoadingStartUp.loadButtonImages,0)
        return

if __name__ == '__main__':
    app = FaitApp()
    app.run()
    sys.exit()

loadingscreen.kv

#kivy 1.10.1
    <LoadingScreen>:
        canvas:
            Color:
                rgba: 1, 1 , 0, 1
            Rectangle:
                size: self.size
        Label:
            font_size: 42
            text: root.name

mainscreen.kv

#kivy 1.10.1
    <MainScreen>:
        canvas:
            Color:
                rgba: 1, 1 , 0, 1
            Rectangle:
                size: self.size
        Label:
            font_size: 42
            text: root.name

loadingStartUp.py

class LoadingStartUp(object):

    app = None

    def __init__(self, app):
        self.app = app
        return

    def loadButtonImages(self):
        log.debug('LoadingStartUp')
        log.debug('Waiting for everything ready!')
        sleep(5)
        self.app.root.current = 'MainScreen'
        return

Я также пытался использовать Clock.schedule_once() в пределах build() и on_start().Я даже пытался загрузить сайты без ScreenManager с self.root = Builder.load_file().Результат был каждый раз таким же, как описано выше.

Было бы достаточно, я думаю, определить, когда SplashScreen правильно отображается на экране, и запустить метод после этого.

Любые решения / подсказки/ советы / советы очень ценятся!Спасибо!

1 Ответ

0 голосов
/ 12 марта 2019

Я думаю, вы можете получить то, что хотите, исключив sleep(5) из метода loadButtonImages() и изменив вызов Clock.schedule_once(self.LoadingStartUp.loadButtonImages,0) на Clock.schedule_once(self.LoadingStartUp.loadButtonImages,5).Вызов sleep() не позволяет GUI что-либо делать в течение этих 5 секунд.А 5 в вызове Clock.schedule_once() не позволяет отображать главный экран в течение 5 секунд.

...