KivyMD自定义类跨应用使用问题:导入后仅显示空白MDCard
问题分析
出现空白MDCard的核心原因有三个:
easymd.py中的KV样式规则未被加载,自定义类的布局逻辑完全没生效SegmentedControl继承自MDCard,而MDCard不是布局容器,无法直接添加子控件- 主程序中多余的
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
相关产品推荐
相关产品推荐

