You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:05:56