如何在Kivy Python应用中实现快速加载的启动屏
优雅实现Kivy应用启动屏方案探讨
我正在寻找一种优雅的方式,在应用启动时显示启动屏,直至应用完成初始化并可正常使用。使用ScreenManager的常规方案存在问题:我的应用拥有包含大量组件的复杂GUI,启动时Kivy构建GUI的过程中会短暂显示空白窗口,不够专业。
为实现快速加载的启动屏,我将GUI拆分为两部分——仅包含启动屏所需最小元素的部分,以及包含其余内容的主界面部分。先加载前者,再将后者添加到其中,该方案可行(见下方极简示例),但我想知道是否有更优方案。能否在kv-lang中指定优先构建并显示GUI的子集?
现有拆分实现代码
core.py
from kivy.uix.boxlayout import BoxLayout from kivy.app import App from kivy.lang import Builder from kivy.uix.button import Button Builder.load_string(''' <Core>: orientation: 'vertical' Button: size_hint: 1,0.2 text: 'BANNER' BoxLayout: id: mainspace size_hint: 1,0.8 Button: id: splashscreen Image: source: 'images/splash.png' size: self.parent.size pos: self.parent.pos allow_stretch: True keep_ratio: False Button: id: statusbar size_hint: 1,0.1 text: 'STATUS BAR' ''') class Core(BoxLayout): def __init__(self, **kwargs): super(Core, self).__init__(**kwargs) from kivy.clock import Clock Clock.schedule_once(lambda dt: self.init(), 2) def init(self): from mainscreen import MainScreen self.ids.mainspace.remove_widget(self.ids.splashscreen) self.ids.mainspace.add_widget(MainScreen(self)) class MyApp(App): def build(self): return Core() if __name__ == '__main__': MyApp().run()
mainscreen.py
from kivy.lang import Builder from kivy.uix.button import Button Builder.load_string(''' <MainScreen>: size_hint: 1, 1 text: 'MAIN APP' on_press: self.core.ids.statusbar.text = 'MAIN APP PRESSED' on_release: self.core.ids.statusbar.text = 'STATUS BAR' ''') class MainScreen(Button): def __init__(self, core): super(Button, self).__init__() self.core = core
编辑补充:单文件拆分KV构建字符串方案
发现可将所有内容放在同一文件中,只需将kv构建字符串拆分为两部分。在第一个kv字符串中声明的Kivy动态类可在另一个中访问,这很实用(见PinkButton类)。
from kivy.uix.boxlayout import BoxLayout from kivy.app import App from kivy.lang import Builder from kivy.uix.button import Button Builder.load_string(''' <PinkButton@Button>: background_color: 2.75, 1.5, 1.25, 3 <Core>: orientation: 'vertical' PinkButton: size_hint: 1,0.2 text: 'BANNER' BoxLayout: id: mainspace size_hint: 1,0.8 PinkButton: id: splashscreen Image: source: 'images/splash.png' size: self.parent.size pos: self.parent.pos allow_stretch: True keep_ratio: False PinkButton: id: statusbar size_hint: 1,0.1 text: 'STATUS BAR' ''') class Core(BoxLayout): version = "123" def __init__(self, **kwargs): super(Core, self).__init__(**kwargs) from kivy.clock import Clock Clock.schedule_once(lambda dt: self.init(), 2) def init(self): Builder.load_string(''' <MainScreen>: core: None size_hint: 1, 1 PinkButton: size_hint: None, None size: self.parent.size pos: self.parent.pos text: 'MAIN APP ' + self.parent.core.version if self.parent.core else '' on_press: self._ = self.parent.core.ids.statusbar.text self.parent.core.ids.statusbar.text = 'MAIN APP PRESSED' on_release: self.parent.core.ids.statusbar.text = self._ ''') class MainScreen(BoxLayout): def __init__(self, core): super(BoxLayout, self).__init__() self.core = core self.ids.mainspace.remove_widget(self.ids.splashscreen) self.ids.mainspace.add_widget(MainScreen(self)) class MyApp(App): def build(self): return Core() if __name__ == '__main__': MyApp().run()
内容的提问来源于stack exchange,提问作者Eugene B
相关产品推荐
相关产品推荐

