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

KivyMD自定义类跨应用使用问题:导入后仅显示空白MDCard

问题分析

出现空白MDCard的核心原因有三个:

  1. easymd.py中的KV样式规则未被加载,自定义类的布局逻辑完全没生效
  2. SegmentedControl继承自MDCard,而MDCard不是布局容器,无法直接添加子控件
  3. 主程序中多余的Segment多重继承类属于无效代码,无任何作用
解决方案

1. 修改easymd.py文件

加载KV样式,并让SegmentedControl支持容纳子控件:

from kivymd.uix.card import MDCard
from kivymd.uix.boxlayout import MDBoxLayout
from kivy.properties import ObjectProperty, BooleanProperty, StringProperty, ColorProperty
from kivy.lang import Builder

kv = '''
<SegmentedControl>:
    id: segment_panel
    size_hint_y: None
    height: self.minimum_height
    md_bg_color: 'red' if not self.segment_color else self.segment_color
    # 内部嵌套布局容器,用于存放子项
    MDBoxLayout:
        id: container
        orientation: 'horizontal'
        size_hint: 1, 1
        spacing: 0

<SegmentedControlItem>:
    id: s1
    text: ''
    color: 'black'
    size_hint_y: None
    height: self.minimum_height
    elevation: 0
    md_bg_color: 'red' if not s1.active else '#4CAF50'
    padding: 20

    MDLabel:
        id: l1
        size_hint_y: None
        text: s1.text
        halign: 'center'
        color: s1.color
        pos_hint: {"center_y": .5}
        height: self.texture_size[1]
'''

# 加载自定义KV样式
Builder.load_string(kv)

class SegmentedControl(MDCard):
    segment_color = ColorProperty(None)
    container = ObjectProperty(None)

    # 重写add_widget,将子项添加到内部布局容器
    def add_widget(self, widget, index=0, canvas=None):
        if isinstance(widget, SegmentedControlItem):
            self.container.add_widget(widget)
        else:
            super().add_widget(widget, index, canvas)

class SegmentedControlItem(MDCard):
    segment_color = ColorProperty(None)
    active = BooleanProperty(True)
    text = StringProperty('')
    color = ColorProperty('black')

2. 修改主程序代码

删除无效的多重继承类,简化逻辑:

from kivymd.app import MDApp
from kivy.lang import Builder
from easymd import SegmentedControl, SegmentedControlItem

kv = '''
MDBoxLayout:
    orientation: 'vertical'
    md_bg_color: 'pink'
    padding: 20
    SegmentedControl:
        SegmentedControlItem:
            text: 'Hello'
        SegmentedControlItem:
            text: 'World'
            active: False
'''

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

if __name__ == '__main__':
    SegmentSwapApp().run()
关键修改说明
  • 加载KV样式:通过Builder.load_string(kv)让自定义类的布局规则生效
  • 支持子控件嵌套:在SegmentedControl内部添加MDBoxLayout容器,并重写add_widget方法,确保子项被正确添加到容器中
  • 完善属性绑定:给SegmentedControlItem显式定义text、color属性,保证KV中的绑定逻辑正常工作
  • 状态可视化:给SegmentedControlItem添加active状态对应的背景色变化,方便区分选中/未选中状态

内容的提问来源于stack exchange,提问作者Mr Stranger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:40:55