KivyMD切换屏幕时丢失调色板与MDCard的elevation问题
问题分析与解决
问题1:MDCard阴影(elevation)丢失
根源是使用了普通ScreenManager而非MDScreenManager,后者专为KivyMD组件设计,能正确处理屏幕切换时的主题属性刷新。
问题2:深色模式下主调色板设置失效
同样因ScreenManager类型错误,加上全局作用域中创建的未使用MDScreenManager实例干扰主题状态,导致主题变更未正确传播到返回的屏幕。
修正后的代码
main.py
from kivy.config import Config Config.set('graphics', 'fullscreen', 0) Config.set('graphics', 'window_state', 'maximized') from kivymd.app import MDApp from kivy.lang import Builder from kivymd.uix.screen import MDScreen from kivy.core.window import Window class Home(MDScreen): pass class Settings_1(MDScreen): pass Window.size = (800, 480) class Test(MDApp): dialog = None def build(self): self.theme_cls.primary_palette = "Blue" self.theme_cls.theme_style = "Light" self.theme_cls.theme_style_switch_animation = True self.theme_cls.material_style = "M3" return Builder.load_file('kivy.kv') def on_checkbox_active(self, value): if not value.active: self.theme_cls.primary_palette = "Gray" self.theme_cls.theme_style = "Dark" else: self.theme_cls.primary_palette = "Blue" self.theme_cls.theme_style = "Light" if __name__ == "__main__": print('Starting') Test().run()
kivy.kv
MDScreenManager: Home: Settings_1: <Home>: name:'home' MDCard: elevation: 3 orientation: 'vertical' adaptive_height: True radius: 20 pos_hint: {"center_x": .5, "center_y": .5} size_hint: 0.3, 0.3 md_bg_color: app.theme_cls.bg_darkest padding: dp(5), dp(10) spacing: dp(10) MDLabel: text: 'Label 1' halign: 'center' pos_hint: {'center_x': 0.5,'center_y':0.8} MDSeparator: MDSwitch: active: True icon_active: "white-balance-sunny" icon_inactive: "moon-waning-crescent" on_active: app.on_checkbox_active(self) pos_hint: {'center_x': 0.5,'center_y':0.5} MDSeparator: MDRectangleFlatButton: text: 'Next screen' pos_hint: {'center_x': 0.5,'center_y':0.2} on_press: root.manager.current ='settings_1' root.manager.transition.direction = 'left' <Settings_1>: name:'settings_1' MDCard: elevation: 3 orientation: 'vertical' adaptive_height: True radius: 20 pos_hint: {"center_x": .5, "center_y": .5} size_hint: 0.3, 0.3 md_bg_color: app.theme_cls.bg_darkest padding: dp(5), dp(10) spacing: dp(10) MDLabel : text: 'Label 2' halign: 'center' MDRectangleFlatButton: text: 'Previous screen' pos_hint: {'center_x': 0.5,'center_y':0.2} on_press: root.manager.current ='home' root.manager.transition.direction = 'right'
关键修正点
- 替换ScreenManager为MDScreenManager:确保KivyMD组件的主题属性在屏幕切换时正确保留和刷新。
- 移除未使用的全局MDScreenManager实例:避免干扰应用主题状态。
- 修正MDSwitch的theme_text_color设置:原设置使用无效值,移除后组件将继承默认主题颜色,避免样式异常。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

