所以我有一个变量用来选择我是想显示2d散点图还是3d散点图
逻辑本质上是这样的
dim = 2
if dim == 2
2D html and elements
if dim == 3
3D html and elements
2d graph callback
3d graph callback
但我想让它,所以我可以有一个下拉菜单,我可以在2和3之间选择更新全局定义的dim
变量。
from dash import Dash, dcc, html, Input, Output
app = Dash(__name__)
app.layout = html.Div([
dcc.Dropdown(['2D', '3D'], '2D', id='demo-dropdown'),
html.Div(id='dd-output-container')
])
@app.callback(
Output('dd-output-container', 'children'),
Input('demo-dropdown', 'value')
)
def update_output(value):
if value == '2D':
dim = 2
else:
dim = 3
return f'You have selected {value}'
if __name__ == '__main__':
app.run_server(debug=True)
在这种情况下,我希望dim
变量更新为2或3每次我选择下拉项。
请让我知道这是可能的,或者如果有一个替代的实现。
当我在我的代码中尝试它(与上面不一样)它不会崩溃,但它不会改变dim
。
这里有几个问题。
首先,您编写的代码没有将dim
声明为全局变量。该变量是在update_output()
函数中赋值的,这使得它成为局部变量,并意味着一旦函数退出,它就会被销毁。你可能会对w3schools上关于全局变量和局部变量的介绍感兴趣。
然而,下一个问题是Dash明确建议不要使用全局变量。
管理全局状态的正确方法是使用Dash中的dcc.Store()组件,这里有一个教程。
以上面的示例为例,您将按如下方式使用dcc.Store
:
app = Dash(__name__)
app.layout = html.Div([
dcc.Dropdown(['2D', '3D'], '2D', id='demo-dropdown'),
html.Div(id='dd-output-container'),
dcc.Store(id='dim')
])
@app.callback(
Output('dd-output-container', 'children'),
Output('dim', 'data'),
Input('demo-dropdown', 'value')
)
def update_output(value):
if value == '2D':
dim = 2
else:
dim = 3
return f'You have selected {value}', dim
您可以在其他回调中读取dim
Store,如下所示:
@app.callback(
Output('some_output', 'children'),
Input('dim', 'data')
)
def some_callback(dim_data):
if dim_data == '1':
pass
return "blah"
您可以使用像字典这样的可变对象来存储有关dim的信息,以便可以在update_function
中更改它。例如:
dim_dict = {'dim': None}
然后在回调中:
@app.callback(
Output('dd-output-container', 'children'),
Input('demo-dropdown', 'value')
)
def update_output(value):
if value == '2D':
dim_dict['dim'] = 2
else:
dim_dict['dim'] = 3
return f'You have selected {value}'