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

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'

关键修正点

  1. 替换ScreenManager为MDScreenManager:确保KivyMD组件的主题属性在屏幕切换时正确保留和刷新。
  2. 移除未使用的全局MDScreenManager实例:避免干扰应用主题状态。
  3. 修正MDSwitch的theme_text_color设置:原设置使用无效值,移除后组件将继承默认主题颜色,避免样式异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:35:27