破折号回调活动单元格仅在特定列上

Dash callback active cell only on specific column

提问人:Prmake 提问时间:10/16/2023 更新时间:10/17/2023 访问量:31

问:

我正在使用下面的方法在单击我的 Dash DataTable 中的任何单元格时打开一个模式。但是,我只希望在单击第一列中的单元格时打开模态,而不是每个单元格都打开模态。关于如何仅将其应用于第一列中的活动单元格的任何提示?callbackcallback

@app.callback(Output('modal', 'is_open'),
              [Input('Data_Table', 'active_cell'),
               Input('close', 'n_clicks')],
              [State("modal", "is_open")])
def toggle_modal(n1, n2, is_open):
    if n1 or n2:
        return not is_open
    return is_open
python 回调 plotly-dash

评论


答:

0赞 Waleed Malik 10/17/2023 #1

您可以访问数据表中活动单元格的位置,如下所示:

active_cell['column'] # column number (int)
active_cell['row'] # row number (int)
active_cell['column_id'] # column name (str)

下面是一个完整的工作示例,其中单击该单元格时,仅第一列中的单元格的值将在模式中返回:

from dash import Dash, html, Input, Output, State, dash_table, no_update
import dash_bootstrap_components as dbc
import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/solar.csv')

app = Dash(__name__,external_stylesheets=[dbc.themes.BOOTSTRAP])

modal = html.Div(
    [
        dbc.Modal(
            [
                dbc.ModalHeader(dbc.ModalTitle("Header")),
                dbc.ModalBody(id='modal-body'),
                dbc.ModalFooter(
                    dbc.Button(
                        "Close", id="close", className="ms-auto", n_clicks=0
                    )
                ),
            ],
            id="modal",
            is_open=False,
        ),
    ]
)

app.layout = html.Div(
    [
        modal,
        dash_table.DataTable(id='datatable',data=df.to_dict('records'), columns=[{"name": i, "id": i} for i in df.columns])

    ]
)

@app.callback(
    [Output('modal','is_open'),Output('modal-body','children')],
    Input('datatable','active_cell'),
    State("modal", "is_open")

)
def open_modal(active_cell,is_open):
    if active_cell['column'] == 0:
        return [not is_open, df[active_cell['column_id']][active_cell['row']]]
    return [no_update,no_update]


if __name__ == '__main__':
    app.run(debug=True)