如何在Kivy文件中为自定义类设置Kivy内定义的类属性
问题描述
开发设置界面时,为了复用组件创建了带content_cls属性的SettingCard类,希望在Kivy文件(kv)中将该属性赋值为kv内定义的类,但运行时提示Nav_drawer_header未定义。
原始代码修正版
main.py
from kivymd.app import MDApp from kivymd.uix.screenmanager import MDScreenManager from kivymd.uix.card import MDCard from kivy.properties import ObjectProperty, StringProperty # 修正拼写错误 from kivy.lang import Builder from kivy.factory import Factory # 导入Factory用于访问kv内定义的类 Builder.load_file("mainfiles\\kivymd2.kv") class SettingCard(MDCard): right_text = StringProperty("") # 修正拼写错误 content_cls = ObjectProperty() class WidgetsManager(MDScreenManager): pass class MainApp(MDApp): def build(self): return WidgetsManager() def on_start(self): # 获取SettingCard实例 setting_card = self.root.get_screen("setting screen").ids.fast_setting # 如果content_cls已赋值,创建实例并添加到卡片中 if setting_card.content_cls: content_instance = setting_card.content_cls() setting_card.add_widget(content_instance) if __name__ == "__main__": MainApp().run()
kivymd2.kv
<Nav_drawer_header@MDLabel>: size_hint : None , None adaptive_size : True font_style : "H5" theme_text_color : "Primary" font_name : "mainfiles\\B-NAZANIN.ttf" <SettingCard>: # 统一类名,与Python中的SettingCard保持一致 _no_ripple_behavior : True size_hint : None , None adaptive_height : True radius : dp(20) , dp(20) , dp(20) , dp(20) md_bg_color : "lightgrey" width : self.parent.width MDLabel: bold : True font_size : 35 text : app.farsi_font(root.right_text) size_hint : None, None adaptive_size : True pos_hint : {"center_y" : .5 , "right" : .9} font_name : "mainfiles\\B-NAZANIN.ttf" <WidgetsManager>: # 修正类名,与Python中的WidgetsManager一致 MDScreen: name : "setting screen" FitImage: size_hint : 1 , .9 source : "images\\download (8).jpg" pos_hint : {"top" : .9} MDScrollView: do_scroll_x : False do_scroll_y : True id : setting_scroll width : root.width height : root.height/10*9 MDGridLayout: size_hint : None , None adaptive_height : True width : self.parent.width cols : 1 SettingCard: id : fast_setting right_text : "شروع سریع" content_cls : Factory.Nav_drawer_header # 使用Factory引用kv内定义的类
解决要点
修正拼写与类名统一:
- 修复
kivy.proeprties、StringProeprty的拼写错误 - 对齐Python与kv文件中的类名:Python中的
SettingCard对应kv中的<SettingCard>,WidgetsManager对应<WidgetsManager>,避免名称不匹配导致的识别问题
- 修复
引用kv内部定义的类:
kv文件中自定义的类属于内部命名空间,无法直接通过类名赋值,必须使用Factory.类名的方式获取类对象,因此将content_cls : Nav_drawer_header改为content_cls : Factory.Nav_drawer_header正确添加子组件:
原on_start方法逻辑错误,需先获取SettingCard的实例,再通过content_cls创建组件实例并添加到卡片中,而非直接调用类的add_widget方法
内容的提问来源于stack exchange,提问作者AmirHosien
相关产品推荐
相关产品推荐

