我正在使用 Plotly Dash 创建仪表板。我想要多个选项卡,当用户点击任何特定选项卡时,相关回调被触发。
main.py
文件调用一个layout.py
文件来生成布局。这是我将如何处理的代码片段。
def create_layout(app):
@callback(Output("tab-output", "children"), Input("tab-input", "value"))
def update_tab(tab):
if tab == "tabname1":
return my_individual_script.render(app) # might work, might not
elif tab == "tabname2":
return f"You selected tab {tab}." # works properly
# 1st alternative (succeeds ✅)
layout = html.Div(children=[
dcc.Tabs(id="tabs-input", value="tabname1",
children=[dcc.Tab(label="foo", value="tabname1"), dcc.Tab(label="bar", value="tabname2")]),
my_individual_script.render(app)
])
# 2nd alternative (fails ❌)
layout = html.Div(children=[
dcc.Tabs(id="tab-input", value="tabname1",
children=[dcc.Tab(label="foo", value="tabname1"), dcc.Tab(label="bar", value="tabname2")]),
html.Div(id="tab-output")
])
return layout
我期待的/我尝试过的:
update_tab
调用正确的单独脚本来呈现该选项卡的所有内容。因此使用my_individual_script
.my_individual_script
调用具有自己的回调的渲染函数。my_individual_script
。显然,这是期望的行为,因为我希望内容根据选项卡选择而改变。在这里,我放置一个 ID 为 html.Div
的 tab-output
来触发 update_tab
。我认为它应该有效,因为我从 tabname2
.Input("tab-output", "children")
的回调提供my_individual_script
,但我不确定这是否适用于此,考虑到回调是基于父级中的if
条件触发的打回来。它也不起作用。这是
my_individual_script.py
中的代码,其回调在第二个备选方案中无法触发:
def render(app):
@callback(Output("output-div", "children"), [Input("dropdown", "value")])
def update_value(value):
return f"You have selected {value}."
div = html.Div(children=[
dcc.Dropdown(["foo", "bar"], "foo", id="dropdown"),
html.Br(),
html.Div(id="output-div")
])
return div
在这段代码中,初始化了一个带有两个选项的下拉菜单,我想做的就是打印出用户在下拉菜单下方的
html.Div
中选择的内容。这最终是我在第二个选择中写div
时想要出现的html.Div(id="tab-output")
问题是
my_individual_script
中的回调没有被触发。为什么当我尝试使用父回调的输出 ID 通过 html.Div
访问其内容时特别是这种情况?
是不是和我的回调依赖另一个回调有关,所以
dash
初始化的时候没看到?
如何允许基于用户单击的选项卡“动态”加载脚本?
对这里可能出现的任何语法错误表示歉意。我不得不从另一台计算机转录这段代码,所以这里的任何错误都不对应于我正在使用的代码中的语法错误。
我没有收到任何错误消息,因此很难在 StackOverFlow 或其他地方搜索与我的问题相对应的答案。