Mtl Dev
Mtl Dev

Reputation: 1622

Clean way to close splashscreen in kivy after a delay

In Kivy, if you have a ScreenManager with multiple screens already added, you can not change screens with the switch_to function, as that also tries to first add the Screen to the Screenmanager, before switching to it.

Instead, you switch screens simply by setting the current property, like this:

screenmanager.current = "new_screen_name"

The problem is, I wish my SplashScreen to automatically transition to MainScreen after a short delay, using Clock.schedule_once(). But that can only take a function as a parameter, so I I have to write a another function just to change screen, like this:

class MyScreenManager(ScreenManager):
    def __init__(self, **kwargs):
        super(MainScreenManager, self).__init__(**kwargs)
        Clock.schedule_once(switch_to_main_screen, 3)

    def switch_to_main_screen(self, *args):
        self.current = "main_screen

I'm just wondering if there is a more efficient way to do this? e.g can I somhow directly set the "self.current" property in Clock.schedule_once? Or, generally speaking, is there a better way to do this simple task? (i.e have a parameter be set a few seconds in the future)

Upvotes: 0

Views: 84

Answers (2)

John Anderson
John Anderson

Reputation: 38937

You can use the setattr() python built-in. Try replacing:

Clock.schedule_once(switch_to_main_screen, 3)

with:

Clock.schedule_once(lambda dt: setattr(self, 'current', 'main_screen'), 3)

See the documentation.

Upvotes: 1

Oussama
Oussama

Reputation: 96

Consider this, its my ready sheet in kivy:

import #what u need

Builder.load_file('the.kv')
      

class fscreen(Widget):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        

class secscreen(Widget):

    def __init__(self,**kwargs):
        super().__init__(**kwargs)

        pass


class thscreen(Widget):
    
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        pass

            
class theapp(App):
    def build(self):
        
        self.screenm = ScreenManager() 

        self.fscreen = fscreen()                 ## as default this is my 
        screen = Screen(name = "first screen")   #   my first screen
        screen.add_widget(self.fscreen)          # if i want second screen
        self.screenm.add_widget(screen)          # as first i move this below
                                                 ##  secscreen its waay
        self.secscreen = secscreen()             ###    efficient
        screen  = Screen(name = "secondscreen")
        screen.add_widget(self.secscreen)
        self.screenm.add_widget(screen)

        self.thscreen = thscreen()
        screen  = Screen(name = "thirdscreen")
        screen.add_widget(self.thscreen)
        self.screenm.add_widget(screen)
        return self.screenm

if __name__ == "__main__":
theapp = theapp()    
theapp.run()          

This way the fscreen is by default the first screen after the presplash

Upvotes: 1

Related Questions