You need to enable JavaScript to run this app. Kivy如何将自定义widget添加到另一自定义widget及空白应用问题排查
优惠活动
大模型
产品
解决方案
定价
更多

Kivy如何将自定义widget添加到另一自定义widget及空白应用问题排查

问题根因

这是Kivy KV语言的硬性规则导致的:所有自定义Widget类的名称必须以大写英文字母开头,KV解析器才能将其识别为需要实例化添加的子控件;如果类名首字母小写,KV会默认把它当成父控件的属性来处理,不会实际创建控件添加到界面中,所以你会得到空白界面。

你额外添加首字母大写的系统控件MDLabel后能正常显示,属于KV解析的兼容逻辑触发的非预期效果,不符合规范。

解决方法

将自定义类的名称统一修改为大写开头,对应调整KV中的声明即可,不需要添加多余控件,修改后的完整可运行代码如下:

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager
from kivy.uix.gridlayout import GridLayout
from kivymd.uix.boxlayout import MDBoxLayout

kv = """
<SCManager>:
    Screen:
        CScreen:

<CScreen>:
    cols: 2
    canvas.before:
        Color:
            rgba: 1,0,0,1
        Rectangle:
            pos: self.pos
            size: self.size

    MDBoxLayout:
        md_bg_color: (1, 1, 1 ,1)
        padding: 10
        adaptive_height: True

        MDLabel:
            text: "helow 2"
            color: (0.0003, 0.34, 0.60,1)
            font_style: "H6"
            halign: "left"
            adaptive_height: True

<Navigator>:
    canvas.before:
        Color:
            rgba: 1,1,0,1
        Rectangle:
            pos: self.pos
            size: self.size
    orientation: "vertical"

    MDLabel:
        text: "hellow"
        adaptive_height: True

    MDList:
        OneLineAvatarListItem:
            text : "Dashboard"
            IconLeftWidgetWithoutTouch:
                icon: "view-dashboard"


        OneLineAvatarListItem:
            text : "Manage Users"
            IconLeftWidgetWithoutTouch:
                icon: "account"

    MDRoundFlatIconButton:
        text: "bye"
        font_size: 11

"""


class SCManager(ScreenManager):
    pass

class Navigator(MDBoxLayout):
    pass

class CScreen(GridLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.n = Navigator()
        self.add_widget(self.n)


class test(MDApp):
    def build(self):
        Builder.load_string(kv)
        return SCManager()


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

内容的提问来源于stack exchange,提问作者ReservedChery _G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 22:51:02