You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:04:58