Dash表格无法根据dcc.Input输入值自动更新问题求助
Dash表格无法根据输入框更新的问题解决
你的代码里存在几个关键问题,导致表格无法正常更新:
1. 组件ID不匹配
回调函数中指定的输出目标ID是mantas_table(下划线),但布局里表格组件的实际ID是mantas-table(横杠),Dash无法找到对应的组件,因此更新指令无法生效。
2. SQL语句语法错误
拼接SQL查询语句时,and关键字前面没有添加空格,生成的语句会出现类似ORIG_TRXN_ACTVY_AM < 1000and ORIG_TRXN_ACTVY_AM > 0的错误格式,数据库无法解析该语句。
3. 未处理输入空值
当用户尚未在输入框中输入数值时,am_min和am_max会是None,直接将其转为字符串拼接进SQL语句会导致查询失败。需要为输入框设置默认值,或者在回调函数中处理空值情况。
4. 冗余的数据读取操作
代码中重复执行了两次CSV文件读取和数据截取操作,可以合并为一次,避免不必要的资源消耗。
修复后的完整代码
from dash import Dash, html, dcc, callback, Output, Input, dash_table import plotly.express as px import pandas as pd import pandasql as ps # 仅读取一次数据 df = pd.read_csv('C:\\Users\\PENGYUANZHANG\\PycharmProjects\\pythonProject5\\Data\\Mantas_test.csv') df = df.iloc[:100] app = Dash( __name__, meta_tags=[{"name": "viewport", "content": "width=device-width, initial-scale=1"}], ) app.title = "Hub and Spoke Dashboard" server = app.server app.config.suppress_callback_exceptions = True colors = {'background': '#111111', 'text': '#7FDBFF'} app.layout = html.Div(style={'backgroundColor': colors['background']}, children=[ html.H1(children='Mantas transactions', style={'textAlign': 'center', 'color': colors['text'], 'fontSize': 30}), html.Hr(), "Minimum Originator Amount: ", # 设置输入框默认值,避免空值问题 dcc.Input(id='am_min', type='number', min=0, step=500, placeholder='Min Orig Amount', value=0), html.Br(), # 用html.Br()替代\n,确保换行生效 "Maximum Originator Amount: ", dcc.Input(id='am_max', type='number', max=100000000, step=500, placeholder='Max Orig Amount', value=df['ORIG_TRXN_ACTVY_AM'].max()), html.Hr(), dcc.RadioItems(options=['ORIG_TRXN_ACTVY_AM', 'BENEF_TRXN_ACTVY_AM', 'SEND_TRXN_ACTVY_AM'], value='ORIG_TRXN_ACTVY_AM', id='controls-and-radio-item'), dash_table.DataTable(id='mantas-table', data=df.to_dict('records'), page_size=20, style_data={'color': colors['text'], 'backgroundColor': colors['background']}, style_header={'color': colors['text'], 'backgroundColor': '#222222'}, style_cell={'backgroundColor': colors['background']}), dcc.Graph(figure={}, id='controls-and-graph') ]) @callback( Output('controls-and-graph', 'figure'), Input('controls-and-radio-item', 'value') ) def update_graph_radio(col_chosen): fig = px.histogram(df, x='ORIG_NM', y=col_chosen, histfunc='avg') fig.update_layout( plot_bgcolor=colors['background'], paper_bgcolor=colors['background'], font_color=colors['text'] ) return fig @callback( Output('mantas-table', 'data'), # 修正为正确的组件ID [Input('am_min', 'value'), Input('am_max', 'value')], prevent_initial_call=False # 改为False,确保初始加载时表格能根据默认值显示 ) def update_table(am_min, am_max): # 处理输入值,确保不会出现None am_min = am_min if am_min is not None else 0 am_max = am_max if am_max is not None else df['ORIG_TRXN_ACTVY_AM'].max() # 修正SQL语句的空格问题,用f-string更简洁 query = f"SELECT * FROM df WHERE ORIG_TRXN_ACTVY_AM < {am_max} AND ORIG_TRXN_ACTVY_AM > {am_min}" new_df = ps.sqldf(query, locals()) return new_df.to_dict('records') if __name__ == '__main__': app.run(debug=True)
额外优化点
- 将
\n替换为html.Br(),确保页面上的换行正常显示 - 修正了样式中的
backgroundcolor为驼峰式backgroundColor,确保背景色生效 - 为表格表头设置了更深的背景色,提升可读性
- 使用f-string拼接SQL语句,更简洁易读
内容的提问来源于stack exchange,提问作者Troy Zhang
相关产品推荐
相关产品推荐

