Python 破折号 : Function should not run when n_clicks < 0 and defined in a call back

标签 python plotly-dash

我正在开发plotly dash 应用程序。我有一个几乎可以工作的例子。唯一不起作用的是我无法限制回调中定义的函数在页面加载时不运行。

我尝试在回调中添加对 n_clicks 的检查,但它似乎不起作用。它也无需点击即可运行该功能

下面是破折号的代码

from datetime import date
import base64
import dash
import plotly
import dash

from dash.dependencies import Input, Output, State
from plotly.graph_objs import *
from datetime import datetime as dt
import dash_html_components as html
import dash_core_components as dcc

import flask
import pandas as pd

server = flask.Flask('app')

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash('app', server=server, external_stylesheets=external_stylesheets)



app.layout = html.Div(style={'backgroundColor': '#EFEAEA', 'margin': '0px', 'padding': '0px'}, children=[
    html.Div([
        html.Div([
            html.Img(src='data:image/png;base64,{}'.format(encoded_image.decode()),
                 style={'width': '200px', 'height': '100px', 'display': 'inline-block', 'float': 'left', 'padding-left': '5px', 'padding-top': '5px'})
        ]),
        html.Div([
            html.Div([
                html.Div([
                    dcc.Dropdown(
                        id='demographics',
                        options=[
                            {'label': 'All 18-49', 'value': '18_39'},
                            {'label': 'Female 25-54', 'value': '25_54 F'},
                            {'label': 'All 25-54', 'value': '25-54'},
                        ],
                        placeholder="Select Demographics",
                    )
                ],
                    style={'width': '30.5%', 'display': 'inline-block', 'padding-right': '10px'}),
                html.Div([
                    dcc.DatePickerRange(
                        id='my-date-picker-range',
                        start_date_placeholder_text="Select a Start Date",
                        end_date_placeholder_text="Select an End Date",
                        min_date_allowed=dt(2018, 1, 1),
                        max_date_allowed=dt(2050, 12, 31),
                        initial_visible_month=dt(2019, 1, 2),
                        style={'width': '600', 'display': 'inline-block', 'padding-right': '10px'}
                    ),
                    html.Div(id='output-container-date-picker-range')
                ],
                    style={'width': '30.3%', 'display': 'inline-block', 'padding-right': '10px', 'position': 'relative'})

            ],
                style={
                'backgroundColor': '#EFEAEA',
                'padding': '5px 10px'}),
            html.Div([
                html.Div([
                    dcc.Dropdown(
                        id='Horsepower',
                        options=[
                            {'label': '200', 'value': 'two_hundred'},
                            {'label': '250', 'value': 'two_hundred_fifty'},
                            {'label': '300', 'value': 'three_hundred'},
                            {'label': '350', 'value': 'three_hundred_fifty'},
                            {'label': '400', 'value': 'four_hundred'}
                        ],
                        placeholder="Select TARP",
                    )
                ],
                    style={'width': '20%', 'display': 'inline-block', 'padding-right': '10px'}),
                html.Div([
                    dcc.Dropdown(
                        id='Kilometers',
                        options=[
                            {'label': '250,000', 'value': 250000, 'type': 'number'},
                            {'label': '500,000', ''value': 500000, 'type': 'number'},
                            {'label': '750,000', 'value': 750000, 'type': 'number'},
                            {'label': '1,000,000', 'value': 1000000, 'type': 'number'},
                        ],
                        placeholder="Select Impressions",
                    )
                ],
                    style={'width': '20%', 'display': 'inline-block', 'padding-right': '10px'}),
                html.Div([
                    dcc.Dropdown(
                        id='Speed',
                        options=[
                            {'label': 'Low', 'value': 50, 'type': 'number'},
                            {'label': 'Average', 'value': 100, 'type': 'number'},
                            {'label': 'High', 'value': 150, 'type': 'number'},
                        ],
                        placeholder="Select Frequency",
                    )
                ],
                    style={'width': '20%', 'display': 'inline-block', 'padding-right': '10px'}),
                html.Div([
                    html.Button('Submit', id='submit_button', type='submit', n_clicks=1,
                                style={'width': '100px', 'height': '34.5px', 'margin-bottom': '8px',
                                       'border-radius': '4px', 'display': 'inline-block', 'background-color': '#2D91C3', 'color': 'white'})
                ],
                    style={'display': 'inline-block', 'padding-bottom': '20px', 'verticalAlign': 'middle'}),
            ], style={
                'backgroundColor': '#EFEAEA',
                'padding': '5px'})
            ], style={'position': 'relative', 'left': '250px'})
        ]),

    html.Div([
        html.Div([
            dcc.Graph(id='example-graph', config={'modeBarButtonsToRemove': ['pan2d', 'lasso2d', 'sendDataToCloud',
                                                                             'select2d', 'autoScale2d', 'resetScale2d',
                                                                             'toggleSpikelines',
                                                                             'hoverClosestCartesian']})
        ],
            style={'width': '49.3%', 'display': 'inline-block', 'border': 'thin grey solid',  'margin-left': '5px',
                   'margin-right': '2.5px', 'margin-top': '5px', 'margin-bottom': '2.5px'}),
        html.Div([
            dcc.Graph(id='example-graph1')
        ],
            style={'width': '49.3%', 'display': 'inline-block', 'border': 'thin grey solid', 'margin-left': '2.5px',
                   'margin-right': '5px', 'margin-top': '5px', 'margin-bottom': '2.5px', 'backgroundColor': '#EFEAEA'})
        ], style={'backgroundColor': '#EFEAEA'}),
    html.Div([
        dcc.Graph(id='graph1')
    ],
        style={'width': '99.2%', 'height': '120%', 'display': 'inline-block', 'border': 'thin grey solid', 'margin-left': '2.5px',
               'margin-right': '5px', 'margin-top': '5px', 'margin-bottom': '2.5px', 'backgroundColor': '#EFEAEA'})
    ])


@app.callback(Output('example-graph1', 'figure'),
              [Input('submit_button', 'n_clicks')],
              [State('my-date-picker-range', 'start_date'),
               State('my-date-picker-range', 'end_date')])

def update_graph(n_clicks, start_date,  end_date):
    if n_clicks > 0:
        df = df_new
        start_date_temp = dt.strptime(start_date, '%Y-%m-%d')
        end_date_temp = dt.strptime(end_date, '%Y-%m-%d')
        start_date_new = start_date_temp.replace(start_date_temp.year - 1)
        end_date_new = end_date_temp.replace(end_date_temp.year - 1)
        end_date_string = end_date_new.strftime('%Y-%m-%d')
        start_date_string = start_date_new.strftime('%Y-%m-%d')
        mask = (df['Date'] >= start_date_string) & (df['Date'] <= end_date_string)
        filtered_df = df.loc[mask]
        trace = Scatter(
            y=filtered_df['Weights'],
            x=filtered_df['Date'],
            line=plotly.graph_objs.scatter.Line(
                color='#42C4F7'
            ),
            hoverinfo='skip',
            error_y=plotly.graph_objs.scatter.ErrorY(
                type='data',
                array=filtered_df['Gender'],
                thickness=1.5,
                width=2,
                color='#B4E8FC'
            ),
            mode='lines'
        )
        layout1 = Layout(
            height=450,
            xaxis=dict(
                showgrid=False,
                showline=False,
                zeroline=False,
                fixedrange=True,
                title='Time Elapsed (sec)'
            ),
            yaxis=dict(
                showline=False,
                fixedrange=True,
                zeroline=False,

            ),
            margin=plotly.graph_objs.layout.Margin(
                t=45,
                l=50,
                r=50
            )
        )

        return Figure(data=[trace], layout=layout1)
    else:
        return {"I am the boss"}

我认为 n_clicks 检查不起作用的原因是我收到以下错误

TypeError: strptime() argument 1 must be str, not None

我相信该错误是由于函数内的以下代码造成的,因为页面第一次加载 start_date 将是 none 类型。

start_date_temp = dt.strptime(start_date, '%Y-%m-%d')

有人可以帮忙解决这个问题吗?我期望当页面加载时回调函数不应该运行。

提前非常感谢!!

最佳答案

这是您的问题:

html.Button('提交', id='submit_button', type='提交', n_clicks=1,

您已预设 n_clicks 以获得一个值。只需删除 n_clicks=1 部分,它就会以 None 加载页面。然后,您需要像这样(或类似)检查n_clicks:

如果 n_clicks 不为 None 并且 n_clicks > 0:

它对我有用,并且一直运行直到它与我的示例 df 发生冲突。

关于Python 破折号 : Function should not run when n_clicks < 0 and defined in a call back,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55645485/

相关文章:

python-3.x - Dash App Table 链接不可点击 - Python Web 应用程序问题

python - 破折号中的图形布局

python - 争论有问题

javascript - 如何在 Google 可视化图表 API 中将多个列表用作单个数据

python - 如何为 apply_async 提供 Python 请求 header ?

plotly-dash - 已在 macOS 上安装 Dash,但在运行脚本时出错

python - 使用 Dash/Plotly 绘制分类散点图

python - 阴谋破折号 : How to change line color?

python - 如何让 Dart 生成器函数像 Python 一样运行?

python - 如何以编程方式编辑 Excel 工作表?