Python+Dash - обновление результата после изменения данных

Подскажите, как добавить условие для программы? Вобщем, суть программы простая: вводишь данные и получаешь результат, но нужно добавить также, чтобы после изменения данных результат (старый) пропадал или рядом писалось "неактуальная цена", а после нажатия на кнопку снова программа работала. Вот код:

import dash
from dash.dependencies import Input, Output, State
from dash import dcc, html

# Функція для обрахунку вартості піци
def calculate_pizza_price(base_price, size, base, toppings, cheese, crust_topping):
    # Логіка обрахунку вартості
    size_modifier = 0.0
    if size == 'Середня':
        size_modifier = 0.5
    elif size == 'Велика':
        size_modifier = 1.0

    base_modifier = {'Томатний соус': 0.2, 'Олія': 0.1, 'Вершковий соус': 0.3}.get(base, 0)

    toppings_modifier = sum({'Салямі': 0.2, 'Шампіньйони': 0.3, 'Томати': 0.1, 'Ананаси': 0.2,
                             'Курятина': 0.25, 'Оливки': 0.3, 'Бекон': 0.4, 'Червона риба': 0.7}.get(topping, 0) for
                            topping in toppings)

    cheese_modifier = {'Моцарелла': 0.1, 'Чедр': 0.2, 'Вершковий': 0.15, 'Пармезан': 0.3}.get(cheese, 0)

    crust_topping_modifier = {'Вершковий сир': 0.5, 'Ковбаски': 0.7}.get(crust_topping, 0)

    price = base_price + base_price * (size_modifier) + (100*(toppings_modifier + cheese_modifier + crust_topping_modifier + base_modifier))
    return price

# Створення екземпляру додатку Dash
app = dash.Dash(__name__, external_stylesheets=['https://codepen.io/chriddyp/pen/bWLwgP.css'])

# Определение макета приложения
app.layout = html.Div([
    html.H1('Pizza Constructor', style={'textAlign': 'center', 'color': '#FFFFFF'}),
    html.Div([
        html.Label('Базова вартість (грн):', style={'font-weight': 'bold', 'color': '#FFFFFF'}),
        dcc.Input(id='base-price', type='number', value=100),
        html.Label('Розмір:', style={'font-weight': 'bold', 'color': '#FFFFFF'}),
        dcc.Dropdown(id='size', options=[
            {'label': 'Маленька', 'value': 'Маленька'},
            {'label': 'Середня', 'value': 'Середня'},
            {'label': 'Велика', 'value': 'Велика'}
        ], value='Маленька', style={'color': '#151c47'}),
        html.Label('Основа:', style={'font-weight': 'bold', 'color': '#FFFFFF'}),
        dcc.Dropdown(id='base', options=[
            {'label': 'Томатний соус', 'value': 'Томатний соус'},
            {'label': 'Олія', 'value': 'Олія'},
            {'label': 'Вершковий соус', 'value': 'Вершковий соус'}
        ], value='Томатний соус', style={'color': '#151c47'}),
        html.Label('Топінги:', style={'font-weight': 'bold', 'color': '#FFFFFF'}),
        dcc.Checklist(id='toppings',  options=[
            {'label': 'Салямі', 'value': 'Салямі'},
            {'label': 'Шампіньйони', 'value': 'Шампіньйони'},
            {'label': 'Томати', 'value': 'Томати'},
            {'label': 'Ананаси', 'value': 'Ананаси'},
            {'label': 'Курятина', 'value': 'Курятина'},
            {'label': 'Оливки', 'value': 'Оливки'},
            {'label': 'Бекон', 'value': 'Бекон'},
            {'label': 'Червона риба', 'value': 'Червона риба'}
        ], value=[], style={'color': '#FFFFFF'}),
        html.Label('Сир:', style={'font-weight': 'bold', 'color': '#FFFFFF'}),
        dcc.Dropdown(id='cheese', options=[
            {'label': 'Моцарелла', 'value': 'Моцарелла'},
            {'label': 'Чедр', 'value': 'Чедр'},
            {'label': 'Вершковий', 'value': 'Вершковий'},
            {'label': 'Пармезан', 'value': 'Пармезан'}
        ], value='Моцарелла', style={'color': '#151c47'}),
        html.Label('Топінг для бортиків:', style={'font-weight': 'bold', 'color': '#FFFFFF'}),
        dcc.Dropdown(id='crust-topping', options=[
            {'label': 'Вершковий сир', 'value': 'Вершковий сир'},
            {'label': 'Ковбаски', 'value': 'Ковбаски'},
            {'label': 'Без топінгу', 'value': 'Без топінгу'}
        ], value='Без топінгу', style={'color': '#151c47'}),
        html.Button('Розрахувати ціну', id='calculate-button', n_clicks=0, style={'margin-top': '10px'}),
        html.Label('Результат:', id='result', style={'font-weight': 'bold', 'color': '#FFFFFF'}),
        html.Div(id='pizza-price-output', style={'color': '#FFFFFF'}),
        html.Div(id='clear-output')
    ], style={'maxWidth': '500px', 'margin': 'auto'})
], style={'background-color': '#151c47', 'height': '100vh'})

# Определение обработчика событий для расчета цены піци
@app.callback(
    Output('pizza-price-output', 'children'),
    [Input('calculate-button', 'n_clicks')],
    [State('base-price', 'value'),
     State('size', 'value'),
     State('base', 'value'),
     State('toppings', 'value'),
     State('cheese', 'value'),
     State('crust-topping', 'value')]
)
def update_pizza_price(n_clicks, base_price, size, base, toppings, cheese, crust_topping):
    if n_clicks == 0:
        return ""
    if not (size and base and toppings and cheese):
        return "Оберіть хоча б один розмір, основу, топінг та сир!"
    # Перевірка, чи вибрана основа, яка має топінг для бортиків, не містить томати або ананаси
    if (base in ['Томатний соус', 'Олія']) and (crust_topping in ['Вершковий сир', 'Ковбаски']) and \
            any(topping in ['Томати', 'Ананаси'] for topping in toppings):
        return "Неможливо додати топінг для бортиків у піцу з томатами або ананасами!"
    if (base in ['Вершковий соус']) and (topping in ['Томати'] for topping in toppings):
        return "Неможливо поєднати вершковий соус та томати!"
    # Обрахунок вартості піци
    pizza_price = calculate_pizza_price(base_price, size, base, toppings, cheese, crust_topping)
    if pizza_price > 500:
        return "Ціна піци перевищує 500 грн!"
    return f"Ціна піци: {pizza_price:.2f} грн"

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

Ответы (0 шт):