dash.exceptions.LayoutInDefined:正在尝试为应用程序分配回调,但尚未分配'layout'属性。[绘制虚线]

2024-09-30 18:32:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用PyCharmIDE运行简单代码,但发现以下错误:

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)

所以任何人都有解决这个问题的办法

有人能解决这个错误吗

我认为代码的cyntax不能与PyCharmIDE一起工作

我正试图找出问题到底出在哪里,但我在这一点上失败了:(

如果有人能帮助我,我很高兴:)


Tags: nameinimportappdfpacketvaluemy
2条回答

您需要将布局分配给应用程序:将layout替换为app.layout

在定义回调之前,您需要将定义的布局分配给应用程序。在@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")

相关问题 更多 >