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

如何为Kivy应用实现自动关闭的Splash Screen(启动页)?

问题分析与解决方案

一、你的思路接近,但实现时机有误

用Popup做启动页的方向没问题,但核心问题出在UI操作的时机:在__init__方法里创建并打开Popup时,App的UI环境还未完成初始化,导致Popup无法正常显示。另外,延时关闭不能直接调用dismiss,需要用Kivy的调度器实现。

二、修复Popup实现的步骤

修改Python代码

把Popup的创建逻辑移到on_start方法(App启动完成后触发),并用Clock.schedule_once实现延时关闭:

import kivy
from kivy.app import App
from kivy.uix.popup import Popup
from kivy.uix.floatlayout import FloatLayout
from kivy.clock import Clock

kivy.require('1.9.0')

class LoadSplashScreenDialog(FloatLayout):
    # 启动页无按钮,移除多余的ObjectProperty
    pass

class LayoutTestApp(App):
    SplashImage = 'images/GrapeVineSplashText.jpg'

    def on_start(self):
        # App启动完成后再创建并显示Popup
        content = LoadSplashScreenDialog()
        self._popup = Popup(title="", content=content, size_hint=(1.0, 1.0), auto_dismiss=False)
        self._popup.open()
        # 3秒后自动关闭(第二个参数为延时秒数)
        Clock.schedule_once(lambda dt: self._popup.dismiss(), 3)

if __name__ == '__main__':
    LayoutTestApp().run()

修改kv代码

简化布局,移除无关的按钮逻辑:

<LoadSplashScreenDialog>:
    Image:
        source: app.SplashImage
        fit_mode: "contain"
        size_hint: 1, 1
        canvas:
            Color:
                rgba: 0.1, 0.1, 0.1, 1
            Line:
                width: 2
                rectangle: self.x, self.y, self.width, self.height

三、更优方案:使用Kivy自带的SplashScreen

Kivy官方提供了SplashScreen组件,专门用于实现启动页,无需手动处理弹窗逻辑,代码更简洁:

Python代码

import kivy
from kivy.app import App
from kivy.uix.screenmanager import SplashScreen, ScreenManager, Screen

kivy.require('1.9.0')

class MainScreen(Screen):
    # 你的主应用界面
    pass

class LayoutTestApp(App):
    def build(self):
        sm = ScreenManager()
        # 创建启动页,3秒后自动切换到主界面
        splash = SplashScreen(
            source='images/GrapeVineSplashText.jpg',
            fit_mode='contain',
            size_hint=(1,1),
            auto_dismiss=True,
            delay=3
        )
        sm.add_widget(splash)
        sm.add_widget(MainScreen(name='main'))
        return sm

if __name__ == '__main__':
    LayoutTestApp().run()

可选kv代码(自定义启动页样式)

<SplashScreen>:
    canvas.before:
        Color:
            rgba: 0.1, 0.1, 0.1, 1
        Rectangle:
            pos: self.pos
            size: self.size
    Image:
        source: root.source
        fit_mode: root.fit_mode
        size_hint: 1, 1
        canvas:
            Color:
                rgba: 0.1, 0.1, 0.1, 1
            Line:
                width: 2
                rectangle: self.x, self.y, self.width, self.height

关键说明

  • on_start是App生命周期中,第一个可安全操作UI的钩子方法,适合放置启动页显示逻辑。
  • Clock.schedule_once是Kivy实现延时操作的标准方式,不会阻塞UI线程。
  • SplashScreen内置了延时自动关闭、界面切换逻辑,是官方推荐的启动页实现方案,比Popup更贴合场景。

内容的提问来源于stack exchange,提问作者Todd Hoatson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:00:05