Dash Bootstrap 组件:跨组件替换原色

Dash Bootstrap Components: Replace primary color across components

我目前正在编写 Dash 应用程序,主要使用 Dash Bootstrap 组件。我对布局非常满意,但想调整原色以匹配我公司的配色方案。在下图中,我基本上想用不同的颜色替换所有蓝色的东西。

额外的挑战 是由于托管环境,不幸的是,我只能处理一个大的 Python 文件 - 我不能有额外的 .css文件。

我正在使用 BOOTSTRAP_STYLESHEET = [dbc.themes.SPACELAB]。我知道我可以通过使用例如替换单个组件的颜色style={'background-color':COMPANY_MAIN_COLOR}。有没有办法用不同的颜色代替 SPACELAB 的原色?或者至少,替换每个组件的默认值而不是必须为每个组件手动执行?

如果您可以添加一个 css 文件,我会采用这种方法。然后你可以简单地覆盖主要样式。

但是既然你指出这不是一个选项,你可以为你的按钮创建一个包装函数来设置默认背景颜色样式:

MWE

from dash import Dash, html, dcc
import dash_bootstrap_components as dbc


def CustomButton(*args, **kwargs):
    default_color = "green"
    default_color_light = "lightgreen"
    default_color_dark = "darkgreen"
    kwargs.setdefault("style", {"background-color": default_color, "background-image": "-webkit-gradient(linear, left top, left bottom, from(lightgreen), to(darkgreen))"})
    return dbc.Button(*args, **kwargs)


app = Dash(external_stylesheets=[dbc.themes.SPACELAB])
app.layout = html.Div(
    [
        dbc.Button("Primary", color="primary", className="me-1"),
        CustomButton("Primary", color="primary", className="me-1")
    ]
)

if __name__ == "__main__":
    app.run_server()

这仅设置默认值,因此您可以通过设置 style 属性 来覆盖颜色。如果你不想要默认的渐变,你可以从 setdefault 调用中删除 background-image 部分。

更新

或者,您可以通过 Customizing Dash's HTML Index Template 用 css 覆盖样式。

SPACELAB 样式定义了一个 --primary css 颜色变量,但令人恼火的是它并没有在任何地方使用这个变量。不同的元素也可能以不同的方式改变颜色,所以我认为没有一种简单的万能方法可以做到这一点。但是您可以使用以下方法并为其添加样式,直到它成为您想要的样子

from dash import Dash, html, dcc
import dash_bootstrap_components as dbc

app = Dash(external_stylesheets=[dbc.themes.SPACELAB])
app.index_string = """
<!DOCTYPE html>
<html>
   <head>
       {%metas%}
       <title>{%title%}</title>
       {%favicon%}
       {%css%}
       <style>
           .btn-primary {
              background-image: linear-gradient(red, blue);
           }
           .custom-control-input:checked ~ .custom-control-label::before {
              border-color: red;
              background-color: red;
           }
       </style>
   </head>
   <body>
       {%app_entry%}
       <footer>
           {%config%}
           {%scripts%}
           {%renderer%}
       </footer>
   </body>
</html>
"""

app.layout = html.Div(
    [
        dbc.Button("Primary", color="primary", className="me-1"),
        dbc.Checklist(
            options=[
                {"label": "Option 1", "value": 1},
                {"label": "Option 2", "value": 2},
            ],
            value=[1],
            id="switches",
            switch=True,
        ),
    ],
)

if __name__ == "__main__":
    app.run_server()