da sh .exceptions.LayoutIsNotDefined: Попытка назначить обратный вызов приложению, но свойство `layout` не было назначено. [Da sh Plotly] - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь запустить простой код, используя PyCharm IDE, но нахожу эту ошибку:

Traceback (most recent call last):
  File "D:/Tooling/untitled/SAS.py", line 37, in <module>
    @app.callback(Output('my-graph', 'figure'),
  File "C:\Users\mwx825326\AppData\Local\Programs\Python\Python38-32\lib\site-packages\dash\dash.py", line 886, in callback
    self._validate_callback(output, inputs, state)
  File "C:\Users\mwx825326\AppData\Local\Programs\Python\Python38-32\lib\site-packages\dash\dash.py", line 652, in _validate_callback
    raise exceptions.LayoutIsNotDefined('''
dash.exceptions.LayoutIsNotDefined: 
Attempting to assign a callback to the application but
the `layout` property has not been assigned.
Assign the `layout` property before assigning callbacks.
Alternatively, suppress this warning by setting
`app.config['suppress_callback_exceptions']=True`

, и это мой код:

import os
import dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import plotly.graph_objs as go
#from app import app
from dash.dependencies import Input, Output

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

df = pd.read_csv('MNM_Rotterdam_5_Daily_Details-20191216081027.csv', error_bad_lines=False)
df['Date'] = pd.to_datetime(df.Date, infer_datetime_format=True)

if 'DYNO' in os.environ:
    app_name = os.environ['DASH_APP_NAME']
else:
    app_name = 'dash-timeseriesplot'

layout = html.Div([html.H1("GSM", style={'textAlign': 'center'}),
    dcc.Dropdown(id='my-dropdown',options=[{'label': 'Voice_SetupFailRate_2G', 'value': 'Voice_SetupFailRate_2G'},{'label': 'Voice_DropRate_2G', 'value': 'Voice_DropRate_2G'},{'label': 'OutgHandover_SuccesRate_2G', 'value': 'OutgHandover_SuccesRate_2G'},{'label': 'Packet_SetupFailRate_2G', 'value': 'Packet_SetupFailRate_2G'},{'label': 'Packet_DLMBytes_2G', 'value': 'Packet_DLMBytes_2G'},{'label': 'Availability_2G', 'value': 'Availability_2G'}],
        multi=True,value=['Voice_SetupFailRate_2G'],style={"display": "block","margin-left": "auto","margin-right": "auto","width": "60%"}),
    dcc.Graph(id='my-graph')
], className="container")


@app.callback(Output('my-graph', 'figure'),
              [Input('my-dropdown', 'value')])
def update_graph(selected_dropdown_value):
    dropdown = {"Voice_SetupFailRate_2G": "Voice_SetupFailRate_2G","Voice_DropRate_2G": "Voice_DropRate_2G","OutgHandover_SuccesRate_2G": "OutgHandover_SuccesRate_2G","Packet_SetupFailRate_2G": "Packet_SetupFailRate_2G","Packet_DLMBytes_2G": "Packet_DLMBytes_2G","Availability_2G": "Availability_2G"}
    trace1 = []
    trace2 = []
    for GSM in selected_dropdown_value:
        trace1.append(go.Scatter(x=df[df["GSM"] == GSM]["Date"],y=df[df["GSM"] == GSM]["Open"],mode='lines',
            opacity=0.7,name=f'Open {dropdown[GSM]}',textposition='bottom center'))
        trace2.append(go.Scatter(x=df[df["GSM"] == GSM]["Date"],y=df[df["GSM"] == GSM]["Close"],mode='lines',
            opacity=0.6,name=f'Close {dropdown[GSM]}',textposition='bottom center'))
    traces = [trace1, trace2]
    data = [val for sublist in traces for val in sublist]
    figure = {'data': data,
        'layout': go.Layout(colorway=["#5E0DAC", '#FF4F00', '#375CB1', '#FF7400', '#FFF400', '#FF0056'],
            height=600,title=f"Opening and Closing Prices for {', '.join(str(dropdown[i]) for i in selected_dropdown_value)} Over Time",
            xaxis={"title":"Date",
                   'rangeselector': {'buttons': list([{'count': 1, 'label': '1M', 'step': 'month', 'stepmode': 'backward'},
                                                      {'count': 6, 'label': '6M', 'step': 'month', 'stepmode': 'backward'},
                                                      {'step': 'all'}])},
                   'rangeslider': {'visible': True}, 'type': 'date'},yaxis={"title":"Price (USD)"})}
    return figure

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

Так что у любого есть решение для этого ...

Значит, у кого-нибудь есть решение этой ошибки?

Я думаю, что синтаксис кода не работает с PyCharm IDE ??

Я пытаюсь выяснить, в чем именно проблема, но я терплю неудачу в этом: (..

Я рад, если кто-нибудь может мне помочь:) ...

Ответы [ 2 ]

1 голос
/ 17 января 2020

Перед определением обратного вызова вам необходимо назначить определенное расположение приложения. Перед @app.callback .. добавить следующее: app.layout = layout. Кроме того, вы можете сделать, как указано Frayal , просто замените

layout = html.Div([html.H1("GSM", style={'textAlign': 'center'}),
    dcc.Dropdown(id='my-dropdown',options=[{'label': 'Voice_SetupFailRate_2G', 'value': 'Voice_SetupFailRate_2G'},{'label': 'Voice_DropRate_2G', 'value': 'Voice_DropRate_2G'},{'label': 'OutgHandover_SuccesRate_2G', 'value': 'OutgHandover_SuccesRate_2G'},{'label': 'Packet_SetupFailRate_2G', 'value': 'Packet_SetupFailRate_2G'},{'label': 'Packet_DLMBytes_2G', 'value': 'Packet_DLMBytes_2G'},{'label': 'Availability_2G', 'value': 'Availability_2G'}],
        multi=True,value=['Voice_SetupFailRate_2G'],style={"display": "block","margin-left": "auto","margin-right": "auto","width": "60%"}),
    dcc.Graph(id='my-graph')
], className="container")

на

app.layout = html.Div([html.H1("GSM", style={'textAlign': 'center'}),
    dcc.Dropdown(id='my-dropdown',options=[{'label': 'Voice_SetupFailRate_2G', 'value': 'Voice_SetupFailRate_2G'},{'label': 'Voice_DropRate_2G', 'value': 'Voice_DropRate_2G'},{'label': 'OutgHandover_SuccesRate_2G', 'value': 'OutgHandover_SuccesRate_2G'},{'label': 'Packet_SetupFailRate_2G', 'value': 'Packet_SetupFailRate_2G'},{'label': 'Packet_DLMBytes_2G', 'value': 'Packet_DLMBytes_2G'},{'label': 'Availability_2G', 'value': 'Availability_2G'}],
        multi=True,value=['Voice_SetupFailRate_2G'],style={"display": "block","margin-left": "auto","margin-right": "auto","width": "60%"}),
    dcc.Graph(id='my-graph')
], className="container")
1 голос
/ 17 января 2020

необходимо назначить макет приложению: замените layout на app.layout

...