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

Kivy中多独立.kv屏幕文件集成到main.kv的正确写法

Kivy 多屏幕分kv文件加载实现方案

你的需求完全可以通过kv原生语法实现,无需在Python中调用ScreenManager.add_widget(),报错核心是kv语法使用不当,修正如下:


核心错误点

  • #:include 是文件引入指令,接收文件系统相对路径,不支持Python模块的点分隔导入写法,需将路径中的.替换为路径分隔符/
  • 需在Python端提前声明对应自定义Screen类(仅做类定义,无需写任何UI添加逻辑),kv规则才能正确匹配控件类

修正后代码

1. 目录结构参考(保证路径匹配)

项目根目录/
├─ main.py
├─ main.kv
└─ libs/
   └─ kv/
      ├─ screen1.kv
      └─ screen2.kv

你已编写的screen1.kv、screen2.kv内容无需修改,保持原有代码即可。

2. 修正后的main.kv

#:kivy 2.1.0
# 修正include路径为文件系统相对路径格式
#:include libs/kv/screen1.kv
#:include libs/kv/screen2.kv

ScreenManager:
    Screen:
        name: "main_screen"
        BoxLayout:
            orientation: "vertical"
            Label:
                text: "main screen"
            Button:
                text: "to screen 1"
                # root直接指向当前根控件ScreenManager,无需写app.root
                on_press: root.current = "Screen1"
            Button:
                text: "to screen 2"
                on_press: root.current = "Screen2"
    # 直接实例化自定义屏幕,会自动成为ScreenManager的子控件
    Screen1:
    Screen2:

3. 最小main.py代码(无add_widget逻辑)

from kivy.app import App
from kivy.uix.screenmanager import Screen

# 仅声明自定义屏幕类,匹配kv中的控件规则
class Screen1(Screen):
    pass

class Screen2(Screen):
    pass

class MultiScreenApp(App):
    pass

if __name__ == "__main__":
    MultiScreenApp().run()

原理说明

#:include 指令会在kv解析阶段将被引入文件的内容直接插入到当前kv的对应位置,等价于你把两个分屏的kv规则直接写在main.kv顶部。只要路径正确,kv解析器就能识别Screen1、Screen2的控件规则,在ScreenManager节点下直接实例化就会自动注册为子屏幕,完全不需要手动调用添加组件的方法。

内容的提问来源于stack exchange,提问作者Sachin Dev Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:18:18