简体   繁体   中英

How to add global in a def?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM