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

KivyMD ToggleButton报错:ThemeManager无primary_dark属性求解决方案

KivyMD ToggleButton 可行实现方案

针对你遇到的AttributeError: 'ThemeManager' object has no attribute 'primary_dark'错误,本质是KivyMD版本更新后,主题管理器的颜色属性结构发生变化,旧版primary_dark这类直接属性已被移除,同时官方MDToggleButton行为存在版本兼容问题。以下是两种可行的实现方案:

方案一:修复官方示例的兼容问题

调整自定义按钮的继承顺序,并适配新版本主题颜色的访问方式:

from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.behaviors.toggle_behavior import MDToggleButton
from kivymd.uix.button import MDFlatButton

KV = '''
MDScreen:
    MDBoxLayout:
        adaptive_size: True
        spacing: "12dp"
        pos_hint: {"center_x": .5, "center_y": .5}

        MyToggleButton:
            text: "Show ads"
            group: "x"

        MyToggleButton:
            text: "Do not show ads"
            group: "x"

        MyToggleButton:
            text: "Does not matter"
            group: "x"
'''

class MyToggleButton(MDToggleButton, MDFlatButton):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 适配新版本主题颜色结构
        self.background_down = self.theme_cls.colors[self.theme_cls.primary_palette][self.theme_cls.theme_style]

class Test(MDApp):
    def build(self):
        self.theme_cls.theme_style = "Dark"
        self.theme_cls.primary_palette = "Orange"
        return Builder.load_string(KV)

Test().run()

关键调整:

  • 继承顺序改为MDToggleButton在前,确保行为方法优先生效
  • 用字典形式的颜色访问路径替代旧版直接属性

方案二:使用MDButton原生toggle功能(推荐)

KivyMD的MDButton已原生支持toggle切换,无需额外引入行为组件,实现更简洁:

from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.button import MDButton

KV = '''
MDScreen:
    MDBoxLayout:
        adaptive_size: True
        spacing: "12dp"
        pos_hint: {"center_x": .5, "center_y": .5}

        MDButton:
            text: "Show ads"
            group: "toggle_group"
            toggle: True
            md_bg_color: self.theme_cls.primary_color if self.state == 'down' else self.theme_cls.bg_normal

        MDButton:
            text: "Do not show ads"
            group: "toggle_group"
            toggle: True
            md_bg_color: self.theme_cls.primary_color if self.state == 'down' else self.theme_cls.bg_normal

        MDButton:
            text: "Does not matter"
            group: "toggle_group"
            toggle: True
            md_bg_color: self.theme_cls.primary_color if self.state == 'down' else self.theme_cls.bg_normal
'''

class Test(MDApp):
    def build(self):
        self.theme_cls.theme_style = "Dark"
        self.theme_cls.primary_palette = "Orange"
        return Builder.load_string(KV)

Test().run()

优势:

  • 无需自定义按钮类,直接使用原生组件
  • 通过group属性实现单选组,toggle属性开启切换状态
  • 可通过state属性('normal'/'down')自定义切换时的样式

额外说明

若仍有兼容性问题,建议升级到KivyMD最新稳定版。部分旧版行为组件已整合到原生组件中,官方文档可能存在更新滞后情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 15:19:55