是否可以动态加载dcc.Plotly Dash,dcc.store中值的下拉选项



应用程序用于存储dcc.Input中的值并将其显示在dash_table上。为了存储输入值,使用CCD_ 3。

现在我需要动态地加载第一列的值;学生姓名";在CCD_ 4中作为选项。是否有可能共享dcc.store中第一列的数据作为dcc.Dropdown中选项的输入?

import dash
import dash_core_components as dcc
import dash_html_components as html
import dash_table
from dash.dependencies import Output, Input, State
user_key = 'Student Name'
# Setup table.
columns = ['Student Name', 
'Age', 
'Place',
'Grade']
table = dash_table.DataTable(columns=[{"name": column, "id": column} for column in columns], 
data=[], id="table")
# Create app.

app = dash.Dash(prevent_initial_callbacks=True)
app.layout = html.Div([

html.Div([dcc.Input(id=column, value=column) for column in columns] +
[html.Button("Save", id="save"), dcc.Store(id="cache", data=[]), table]),

html.Div([

dcc.Dropdown(
id='demo-dropdown',
options=[
{'label': 'Mark', 'value': 'mrc'},
],
value='mrc'
)



])




])

@app.callback(Output("table", "data"),
[Input("save", "n_clicks")],
[State("table", "data")] +
[State(column, "value") for column in columns])

def update_table(n_clicks, data, *args):
record = {columns[i]: arg for i, arg in enumerate(list(args))}

try:
record_index = [record[user_key] for record in data].index(record[user_key])
data[record_index] = record

except ValueError:
data.append({columns[i]: arg for i, arg in enumerate(list(args))})

return data

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

是的,您可以从已经填充了一些数据帧的dcc.Store()加载。您将需要一个回调,它将Store的modified_timestamp属性作为Input(),并将其数据作为State(),这在Dash的官方文档中有解释)。所以像这样的回调会起作用:

@app.callback(
[Output("demo-dropdown", "options"), Output("demo-dropdown", "value")],
[Input("cache", "modified_timestamp")],
State("cache", "data"),
)
def update_dropdown_from_store(time_stamp, data):
return (
[
[{"label": i, "value": i} for i in list(df["Student Name"])],
df["Student Name"].iloc[0],
]
if data != []
else [[{"label": "Mark", "value": "mrc"}], "mrc"]
)

最新更新