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
相关产品推荐
相关产品推荐

