Python 更改Dash应用程序中n_click of按钮的值
我正在尝试创建一个应用程序,它可以记录按钮A和按钮B被点击的次数。我通过检查每个按钮的n_click值并将其用作回调中的输入来实现这一点。我还想做的是,如果按钮B的n_点击次数超过按钮A的n_点击次数,则将两个按钮的n_点击次数设置为零 在Dash中是否有这样的目标可以实现?或者我是否需要将变量存储在存储器中,然后在每次单击按钮时更新它们 编辑: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
下面接受的答案需要破折号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)