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)