I'm trying to make a dashtable by Input and then download it, but I have a problem that data after added is not defined. I put global
in def already but it's not worked. Below is my code:
import pandas as pd
import numpy as np
from datetime import datetime as dt
import plotly.express as px
import dash
import dash_html_components as html
import dash_core_components as dcc
from dash.dependencies import Input, Output, State
import dash_table
import dash_bootstrap_components as dbc
from dash_extensions import Download
from dash_extensions.snippets import send_data_frame
import glob
import os
from pandas.tseries.offsets import BDay
import plotly.graph_objects as go
app = dash.Dash(__name__)
MD23 = pd.DataFrame({'Number':[],
'PW':[],
'Name 1':[],
'Name 2':[],
'Email':[],
'Web':[],
'Abc':[]})
# ------------------------------------------------------------------------
input_types = ['number', 'password', 'text', 'tel', 'email', 'url', 'search']
app.layout = html.Div([
html.Div([
dcc.Input(
id='my_{}'.format(x),
type=x,
placeholder="insert {}".format(x), # A hint to the user of what can be entered in the control
minLength=0, maxLength=50, # Ranges for character length inside input box
autoComplete='on',
disabled=False, # Disable input box
readOnly=False, # Make input box read only
required=False, # Require user to insert something into input box
size="20", # Number of characters that will be visible inside box
) for x in input_types
]),
html.Br(),
html.Button('Add Row',id='add_row',n_clicks=0),
dbc.Row([
dbc.Col([html.H5('List',className='text-center'),
dash_table.DataTable(
id='table-container_3',
data=[],
columns=[{"name":i_3,"id":i_3,'type':'numeric'} for i_3 in MD23.columns],
style_table={'overflow':'scroll','height':600},
style_cell={'textAlign':'center'},
row_deletable=True,
editable=True)
],width={'size':12,"offset":0,'order':1})
]),
dbc.Row([
dbc.Col([dbc.Button("Download",id='btn_3',color='dark'),
Download(id='download')
],width={'size':1,"offset":0,'order':1})
]),
])
@app.callback(
Output('table-container_3', 'data'),
Input('add_row', 'n_clicks'),
[State('table-container_3', 'data'),
State('table-container_3', 'columns')]+
[State('my_{}'.format(x), 'value') for x in input_types])
def add_row(n_clicks, rows, columns, selected_number, selected_pw,
selected_text, selected_tel,
selected_email, selected_url,
selected_search):
if n_clicks > 0:
rows.append({c['id']: r for c,r in zip(columns, [selected_number, selected_pw, selected_text, selected_tel,
selected_email, selected_url, selected_search])})
return rows
def update_data(selected_number, selected_pw, selected_text, selected_tel,selected_email, selected_url, selected_search):
global dff
dff = pd.DataFrame({'Number':[selected_number],
'PW':[selected_pw],
'Name 1':[selected_text],
'Name 2':[selected_tel],
'Email':[selected_email],
'Web':[selected_url],
'Abc':[selected_search]})
return dff.to_dict(orient='records')
@app.callback(Output("download","data"),[Input('btn_3','n_clicks')],prevent_initial_call=True)
def generate_excel(n_clicks):
return send_data_frame(dff.to_csv,filename="abc"+".csv",index=False)
# ------------------------------------------------------------------------
if __name__ == '__main__':
app.run_server(debug=False,port='8501')
Actually I can directly export dashtable but I cannot choose folder to save and change name of file so I want to make download like that.
Please give me suggestion. Thank you.
The easier way of doing that define a global variable with initial value empty dictionary then reassigning new value
app = dash.Dash(__name__)
dff = {}
def update_data(selected_number, selected_pw, selected_text, selected_tel,selected_email, selected_url, selected_search):
global dff
dff = pd.DataFrame({'Number':[selected_number],
'PW':[selected_pw],
'Name 1':[selected_text],
'Name 2':[selected_tel],
'Email':[selected_email],
'Web':[selected_url],
'Abc':[selected_search]}).to_dict(orient='records')
return dff
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.