如何在 python 破折号中单击按钮时添加下拉菜单的值?

How to add value of a dropdown while button clicked in python dash?

我的问题很简单,但我是 Dash 和 UI 开发的初学者。

我创建了一个类似下面代码的表单: 我有一个包含两个值(Node 和 Edge)的下拉列表、一个“+”按钮和一个文本区域。用户想要 select 下拉列表中的一个值,然后单击 + 按钮。 selected 值必须添加到文本区域。如果用户再次点击 + 按钮,该值必须再次添加。我的代码更新文本区域广告中的值不会再次添加选定的值。我的代码有什么问题?

import dash_bootstrap_components as dbc
import dash_core_components as dcc
fLayout = dbc.FormGroup([
    dbc.Form([
        dcc.Dropdown(options=[{'label':'Node','value':'Node'},{'label':'Edge','value':'Edge'}],id='fcolumns'),
        dbc.Button ('+',id='fcol_btn')
    ],inline=True),

dbc.Form([
        dbc.Button(['='],id='fequal'),
        dbc.Button (['>'],id='fgt')
    ],inline=True),

dbc.Form([
        dbc.Textarea(id='ftxt'),
        dbc.Button (['ok'],id='ftxt_btn')
    ],inline=True)
]) 


@app.callback(
    Output("ftxt", "value"),
    [Input("fcol_btn", "n_clicks"), Input("fequal", "n_clicks"),Input("fgt", "n_clicks")],
    [State("fcolumns", "value")],
)
def filter_update(fcol_btn, fequal, fgt,fcolumns):
   if fcol_btn>0:
       return fcolumns
   if fequal >0:
       return "="
   if fgt >0:
       return  ">"

不确定我是否完全理解您要实现的目标。但是加号、等号按钮等逻辑需要你根据自己的需要在if语句中自己定义。

在下面找到一个 运行 版本。 一般来说:你应该在设置组件时初始化值,否则你需要捕获所有的无。

import dash
import dash_bootstrap_components as dbc
from dash import dcc
from dash import html
from dash.dependencies import Input, Output, State

app = dash.Dash(__name__)

app.layout =  html.Div([
        dcc.Dropdown(options=[{'label':'Node','value':'Node'},
                              {'label':'Edge','value':'Edge'}],id='fcolumns'),
        dbc.Button ('+',id='fcol_btn',n_clicks=0),
        dbc.Button(['='],id='fequal',n_clicks=0),
        dbc.Button (['>'],id='fgt',n_clicks=0),
        dbc.Textarea(id='ftxt',value=" "),
        dbc.Button (['ok'],id='ftxt_btn',n_clicks=0),
        html.Div(id='final_result',children=[])
]) 


@app.callback(
    Output("ftxt", "value"),
    [Input("fcol_btn", "n_clicks"), 
     Input("fequal", "n_clicks"),
     Input("fgt", "n_clicks"),
     Input("fcolumns", "value")],
    State("ftxt", "value")
)
def do_something(fcol_btn,fequal,fgt,fcolumns,ftxt):
    ctx = dash.callback_context
    if ctx.triggered:
        triggered_item = ctx.triggered[0]['prop_id'].split('.')[0]
    else:
        triggered_item = None
    print('Triggered item was', triggered_item)
    print(f'fcol_btn:{fcol_btn}, fequal:{fequal}, fgt:{fgt}, fcolumns:{fcolumns}')
    operator = ''
    if triggered_item != None:
        if triggered_item == "fcol_btn":
            operator= "+"
        if triggered_item == "fequal":
            operator= "="
        if triggered_item == "fgt":
            operator= ">"
        if operator == '':
            ftxt = str(ftxt)
        else:    
            ftxt = str(ftxt)+operator+str(fcolumns)
        return ftxt

@app.callback( Output("final_result", "children"),
               Input("ftxt_btn", "n_clicks"),
               State("ftxt", "value"))
def return_all(ftxt_btn,text):
    if ftxt_btn>0:
        print(text)
        return [text]

if __name__ == '__main__':
    app.run_server(debug=False, port=8050)