KivyMD ToggleButton报错:ThemeManager无primary_dark属性求解决方案
针对你遇到的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
相关产品推荐
相关产品推荐

