咨询:dcc.Tabs无法应用dbc主题样式的原因及解决方法
Dash Bootstrap主题无法应用到dcc.Tabs组件的问题及解决方法
我重现了Dash官方的Tabs示例并应用Dash Bootstrap的SOLAR主题后,发现tabs组件以及图表区域没有呈现预期的样式。
原代码
from dash import Dash, dcc, html, Input, Output, callback import dash_bootstrap_components as dbc app = Dash(__name__, external_stylesheets=[dbc.themes.SOLAR]) app.layout = html.Div([ html.H1('Dash Tabs component demo'), dcc.Tabs(id="tabs-example-graph", value='tab-1-example-graph', children=[ dcc.Tab(label='Tab One', value='tab-1-example-graph'), dcc.Tab(label='Tab Two', value='tab-2-example-graph'), ]), html.Div(id='tabs-content-example-graph') ]) @callback(Output('tabs-content-example-graph', 'children'), Input('tabs-example-graph', 'value')) def render_content(tab): if tab == 'tab-1-example-graph': return html.Div([ html.H3('Tab content 1'), dcc.Graph( figure={ 'data': [{ 'x': [1, 2, 3], 'y': [3, 1, 2], 'type': 'bar' }] } ) ]) elif tab == 'tab-2-example-graph': return html.Div([ html.H3('Tab content 2'), dcc.Graph( id='graph-2-tabs-dcc', figure={ 'data': [{ 'x': [1, 2, 3], 'y': [5, 10, 6], 'type': 'bar' }] } ) ]) if __name__ == '__main__': app.run_server(debug=True)
当前效果

当前显示的样式与SOLAR主题的预期样式不符,我尝试更换多个主题,都无法将样式应用到tabs上,对比dbc主题浏览器里的tabs效果,差异很明显。
库版本信息
- dash 2.9.3
- dash-bootstrap-components 1.4.1
- dash-core-components 2.0.0
- dash-html-components 2.0.0
问题原因
根本原因是dcc.Tabs是Dash原生组件,而Dash Bootstrap Components(dbc)的主题样式仅针对自身组件生效,不会自动覆盖原生dcc组件的样式。你在dbc主题浏览器里看到的tabs效果,实际是使用dbc.Tabs而非dcc.Tabs实现的。
解决方案(最小代码改动)
替换原生dcc.Tabs为dbc.Tabs,直接继承Bootstrap主题样式,代码改动极小:
from dash import Dash, dcc, html, Input, Output, callback import dash_bootstrap_components as dbc app = Dash(__name__, external_stylesheets=[dbc.themes.SOLAR]) app.layout = html.Div([ html.H1('Dash Tabs component demo'), # 替换dcc.Tabs为dbc.Tabs,子项替换为dbc.Tab dbc.Tabs(id="tabs-example-graph", active_tab='tab-1-example-graph', children=[ dbc.Tab(label='Tab One', tab_id='tab-1-example-graph'), dbc.Tab(label='Tab Two', tab_id='tab-2-example-graph'), ]), html.Div(id='tabs-content-example-graph') ]) @callback(Output('tabs-content-example-graph', 'children'), Input('tabs-example-graph', 'active_tab')) # 属性从value改为active_tab def render_content(tab): if tab == 'tab-1-example-graph': return html.Div([ html.H3('Tab content 1'), dcc.Graph( figure={ 'data': [{ 'x': [1, 2, 3], 'y': [3, 1, 2], 'type': 'bar' }], # 可选:适配主题的图表样式 'layout': { 'plot_bgcolor': 'transparent', 'paper_bgcolor': 'transparent', 'font': {'color': '#fff'} } } ) ]) elif tab == 'tab-2-example-graph': return html.Div([ html.H3('Tab content 2'), dcc.Graph( id='graph-2-tabs-dcc', figure={ 'data': [{ 'x': [1, 2, 3], 'y': [5, 10, 6], 'type': 'bar' }], # 可选:适配主题的图表样式 'layout': { 'plot_bgcolor': 'transparent', 'paper_bgcolor': 'transparent', 'font': {'color': '#fff'} } } ) ]) if __name__ == '__main__': app.run_server(debug=True)
关键改动点
- 将
dcc.Tabs替换为dbc.Tabs,对应属性从value改为active_tab - 将子项
dcc.Tab替换为dbc.Tab,属性从value改为tab_id - 回调函数中Input的属性同步改为
active_tab - 可选:为dcc.Graph添加适配主题的布局样式,让图表和整体风格更统一
这样修改后,tabs组件会自动应用SOLAR主题的样式,和Bootswatch预览效果一致,且代码改动量最小,同时能覆盖更多适配主题的Dash元素。
内容的提问来源于stack exchange,提问作者GallopingNarwhal
相关产品推荐
相关产品推荐

