延迟后在 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)
在 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)