Есть ли способ добавить новый ввод в обратный вызов python dash

#python #callback #plotly-dash

Вопрос:

Я пишу приложение dash с дивами с изображениями в них. Я хочу создать новое изображение при добавлении новой строки в базу данных SQLite. Кроме того, я хочу нажать на это новое изображение, чтобы переместить его в другой раздел. Проблема,с которой я сталкиваюсь, заключается в том, что, хотя я могу добавить ввод([идентификатор нового изображения], n_clicks) в список входов, выходов и состояний, которые я передал обратному вызову, он не прослушивает этот новый ввод. Упрощенные фрагменты кода являются:

Для создания изображения:

  def text(sql_row,id_name):
    #font_size=16
    color='blue'
    image = Image.new("RGB", (400, 500), color)
    draw = ImageDraw.Draw(image)
    row=10
    for row, item in enumerate(sql_row):
        draw.text((10,35, item)
    return html.Img(src=image,id=id_name)
 

и для добавления нового изображения в div, перемещения изображения в следующий div при нажатии и для попытки добавить n_clicks для нового изображения на входы обратного вызова

 
#create the callbacks for the function
callback_children=[Output('div1','children'),Output('div2','children')]
for img in image_list:
    callback_children.append(Input(img.id,'n_clicks'))
callback_children=callback_children [Input('interval-component', 'n_intervals')] [State(component_id='order_in',component_property='children'),State(component_id='order_up',component_property='children'),State(component_id='order_out',component_property='children')] 





@app.callback(callback_children)#children contain n_clicks input for images in divs, div children states and div children outputs
def update_orders(*args):

...
    #add new image to children of div1:
    global callback_children
    new_img=text(new_item,str(new_sql_row))
    div1_children.append(new_img)#This puts the new image in div1
    callback_children.insert(3,Input(new_img.id,'n_clicks'))

    #move image to next div when clicked
    changed_id = [p['prop_id'] for p in ctx.triggered][0]
    ctx = dash.callback_context
    for item,click_value in list(ctx.inputs.items()):
            img_id=str(item).split('.')[0]
            if img_id in changed_id.split('.')[0]:#if image was clicked
                div2_children.append(img_id)#add image to div2 children
                ...
                #code to remove image from div1 children

                ...

    return [div1_children, div2_children]


 

Этот код успешно добавляет изображение в первый div и перемещает изображение из первого div во второй при нажатии, но нажатие на изображение, которое было добавлено в первый div с помощью обратного вызова, ничего не делает, так как его ввод n_clicks отсутствовал в callback_children при запуске сценария. Есть ли способ обновить входные данные обратного вызова, чтобы добавить n_clicks для нового изображения?

Ответ №1:

Для этого вам нужно будет использовать обратные вызовы с сопоставлением шаблонов. Обновление обратного вызова Dash после инициализации не изменит его поведение, но эти обратные вызовы могут использовать несколько динамические входы и выходы, что должно помочь.