延迟后在 kivy 中关闭启动画面的干净方法

Clean way to close splashscreen in kivy after a delay

在 Kivy 中,如果你有一个已经添加了多个屏幕的 ScreenManager,你不能使用 switch_to 函数 更改屏幕,因为那也是尝试先将屏幕添加到 Screenmanager,然后再切换到它。

相反,您只需设置 current 属性 即可切换屏幕,如下所示:

screenmanager.current = "new_screen_name"

问题是,我希望我的 SplashScreen 使用 Clock.schedule_once() 在短暂的延迟后自动转换到 MainScreen。但是那只能接受一个函数作为参数,所以我不得不写另一个函数来改变屏幕,像这样:

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

我只是想知道是否有更有效的方法来做到这一点?例如,我可以通过某种方式直接在 Clock.schedule_once 中设置“self.current”属性 吗?或者,一般来说,有没有更好的方法来完成这个简单的任务? (即在未来几秒钟设置一个参数)

考虑一下,这是我在基维准备的 sheet:

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()          

这样 fscreen 默认是 presplash 之后的第一个屏幕

可以使用setattr()pythonbuilt-in。尝试替换:

Clock.schedule_once(switch_to_main_screen, 3)

与:

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

参见documentation