从Dash中所有其他下拉菜单中删除选项

时间:2020-02-24 14:16:18

标签: plotly-dash

从任何一个下拉列表中选择任何选项时,我希望从所有其他下拉列表中删除该选项。

为帮助可视化,我正在尝试构建列映射器。对于左侧的每个列名称,右侧都有一个下拉菜单,用户可以在该下拉菜单中从上传的文件中选择与左侧名称相对应的列名称。由于源列和目标列具有一对一的关系,因此,从一个下拉列表中选择一个列名时,可以将其从所有其他列中删除。

作为概念验证,我使用下面的代码在一个下拉列表中进行了尝试。当我从其他任何下拉菜单中选择一个选项时,我希望该选项将从该特定选项中删除。我没有收到任何错误,并且回调出现在回调图中,但是它没有任何作用。回调中的print语句甚至不会运行,这意味着该回调实际上根本没有运行。

def generate_output_callback(input_id):
    def dd_callback(input_values, state):
        if not input_values:
            print('Preventing update.'.upper())
            raise PreventUpdate
        else:
            print(f'callback ran for dropdown {input_id}')
            for val in input_values:
                if val:
                    try:
                        i = state.index({'label': val, 'value': val})
                        del state[i]
                    except ValueError:
                        pass
            return state
    return dd_callback


all_cols = ['ACCTNUMBER', 'col2', 'col3']
inputs = {}
for col in all_cols:
    inputs[col] = Input(col, 'value')
all_other_inputs_dict = {k:v for (k,v) in inputs.items() if k != 'ACCTNUMBER'}
all_other_inputs = list(all_other_inputs_dict.values())
cb = generate_output_callback('ACCTNUMBER')
app.callback(
    Output('ACCTNUMBER', 'options'),
    all_other_inputs,
    [State('ACCTNUMBER', 'options')])(cb)

1 个答案:

答案 0 :(得分:0)

我将转储您现在拥有的回调。它已经非常复杂,您仍然必须添加更多下拉列表。您需要的逻辑将要求每个下拉菜单都影响其他每个下拉菜单,而如果没有正确的结构,则很容易变成循环。

为此,隐藏元素将起作用。隐藏元素将保存所有有效的下拉列表值。每个回调都会监听它,并基于它更新其options道具。当用户从各种下拉菜单中选择列时,应侦听所有下拉菜单的value道具的隐藏元素将更新以删除已选择的项目。如果用户从下拉菜单中取消选择列,则隐藏的元素可以将其添加回去,并且所有选项也会更新以将其添加回去。