Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更改Dash应用程序中n_click of按钮的值_Python_Plotly Dash - Fatal编程技术网

Python 更改Dash应用程序中n_click of按钮的值

Python 更改Dash应用程序中n_click of按钮的值,python,plotly-dash,Python,Plotly Dash,我正在尝试创建一个应用程序,它可以记录按钮A和按钮B被点击的次数。我通过检查每个按钮的n_click值并将其用作回调中的输入来实现这一点。我还想做的是,如果按钮B的n_点击次数超过按钮A的n_点击次数,则将两个按钮的n_点击次数设置为零 在Dash中是否有这样的目标可以实现?或者我是否需要将变量存储在存储器中,然后在每次单击按钮时更新它们 编辑: 下面接受的答案需要破折号1.20.0。我必须将我的从1.18.1升级到1.20.0才能获得此功能。无需做任何复杂的事情,只需将按钮的n\u click

我正在尝试创建一个应用程序,它可以记录按钮A和按钮B被点击的次数。我通过检查每个按钮的n_click值并将其用作回调中的输入来实现这一点。我还想做的是,如果按钮B的n_点击次数超过按钮A的n_点击次数,则将两个按钮的n_点击次数设置为零

在Dash中是否有这样的目标可以实现?或者我是否需要将变量存储在存储器中,然后在每次单击按钮时更新它们

编辑:
下面接受的答案需要破折号1.20.0。我必须将我的从1.18.1升级到1.20.0才能获得此功能。

无需做任何复杂的事情,只需将按钮的
n\u clicks
属性作为回调的输出,并根据需要返回零。没有什么可以阻止您使用与同一回调的
输入
输出
相同的属性。下面是一个简单的例子:

import dash
from dash.dependencies import Input, Output
import dash_html_components as html

app = dash.Dash(__name__)

app.layout = html.Div([
    html.Button('Button 1', id='btn1', n_clicks=0),
    html.Button('Button 2', id='btn2', n_clicks=0),
    html.Div(id='msg-container')
])

@app.callback(Output('msg-container', 'children'),
              Output('btn1', 'n_clicks'),
              Output('btn2', 'n_clicks'),
              Input('btn1', 'n_clicks'),
              Input('btn2', 'n_clicks'))
def displayClick(btn1, btn2):
    if btn2 > btn1:
        btn1, btn2 = 0, 0
    msg = "Button 1 clicked {} times, Button 2 clicked {} times".format(btn1, btn2)
    return msg, btn1, btn2

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

以下方法适用于
dash
1.19.0版到当前1.20.0版(可能更高版本)

[1.19.0]-2021-01-19:增加了对具有重叠输入和输出的回调的支持。结合dash.callback\u上下文,这解决了许多需要循环回调的用例


正如您已经说过的,您可以使用
n\u clicks
属性 获取每个按钮被单击的次数的按钮数

n_单击
也可以使用常规的
输出设置

…还是我需要将变量存储在存储器中,然后在每次单击按钮时更新它们

n\u单击
dash.callback\u context
为您跟踪此内容,因此我认为不需要自己跟踪它

除了像n_clicks这样的事件属性在事件发生时(在本例中是单击)都会更改外,还有一个全局变量dash.callback_上下文,仅在回调中可用

您可以如何进行的示例(上面链接的文档中高级回调示例的调整版本):

除了使用
输入
外,如果您需要,还可以使用
状态
来获取
n_单击

不希望在更改
n_单击时触发回调,但您确实希望访问其值。

当我使用此方法时,我得到的错误与
Input
Output
相同。输入0与输出1匹配。我确实按原样尝试了您的代码,并得到了上述错误。是否存在与我正在运行的dash版本相关的任何问题?我正在运行1.18.1。我也在windows上工作,如果这有什么不同的话。@show_-stopper哦,哇,是的,确实如此。我也知道这个版本。升级至dash的最新版本,它应该可以工作(版本1.20.0)。感谢您的帮助。这是我在Dash工作的第二天,所以我还在学习诀窍。谢谢你的帮助。将升级该版本,并在问题仍然存在时返回。谢谢。它现在正在工作。请在您的回答中添加1.20.0版的内容。我将其设置为接受。
import json
import dash
import dash_html_components as html
from dash.dependencies import Input, Output, State

app = dash.Dash(__name__)

app.layout = html.Div(
    [
        html.Button("Button A", id="btn-a"),
        html.Button("Button B", id="btn-b"),
        html.Div(id="container"),
    ]
)


@app.callback(
    Output("container", "children"),
    Output("btn-a", "n_clicks"),
    Output("btn-b", "n_clicks"),
    Input("btn-a", "n_clicks"),
    Input("btn-b", "n_clicks"),
    prevent_initial_call=True,
)
def display(n_clicks_a, n_clicks_b):
    ctx = dash.callback_context

    ctx_msg = json.dumps(
        {"states": ctx.states, "triggered": ctx.triggered, "inputs": ctx.inputs},
        indent=2,
    )

    if n_clicks_a is not None and n_clicks_b is not None and n_clicks_b > n_clicks_a:
        return html.Pre(ctx_msg), 0, 0

    return html.Pre(ctx_msg), n_clicks_a, n_clicks_b


if __name__ == "__main__":
    app.run_server(debug=True)