使用Dash下拉和回调来更新全局变量



所以我有一个变量用来选择我是想显示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

您可以在其他回调中读取dimStore,如下所示:

@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}'

最新更新