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

如何在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内定义的类
解决要点
  1. 修正拼写与类名统一:

    • 修复kivy.proeprties、StringProeprty的拼写错误
    • 对齐Python与kv文件中的类名:Python中的SettingCard对应kv中的<SettingCard>,WidgetsManager对应<WidgetsManager>,避免名称不匹配导致的识别问题
  2. 引用kv内部定义的类:
    kv文件中自定义的类属于内部命名空间,无法直接通过类名赋值,必须使用Factory.类名的方式获取类对象,因此将content_cls : Nav_drawer_header改为content_cls : Factory.Nav_drawer_header

  3. 正确添加子组件:
    原on_start方法逻辑错误,需先获取SettingCard的实例,再通过content_cls创建组件实例并添加到卡片中,而非直接调用类的add_widget方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:20:57