Mundo em Python

Máquina de Café Profissional (Aqui podemos ver limitação de introduzir valores e o uso de dicionário em python)

from tkinter import *

root = Tk()
root.geometry("600x500")
root.resizable(0, 0)
root.config(bg="#103030")
root.title("Máquina de Café Profissional") maquina = {
"Expresso": 1.5,
"Café Longo": 2.0,
"Café com Leite": 2.5,
"Pingo": 2.3,
"Abatanado": 1.8
}
def validar_entrada(novo_valor):
if novo_valor == "":
return True
try:
if float(novo_valor) < 0:
return False
if "." in novo_valor:
partes = novo_valor.split(".")
if len(partes[1]) > 2:
return False
return True
except ValueError:
return False


def atualizar_maquina(opcao):
valor = maquina.get(opcao, "")
valor_bem.config(text=f"{valor:.2f} €")
def mostrar_resultado():
try:
if not Valor_moedas.get():
resultado_texto.config(text="Por favor, insira as moedas primeiro!")
return

moedas = float(Valor_moedas.get().replace(",", ".")) # Aceita vírgula ou ponto
v = var.get()
caf = maquina.get(v) if moedas < caf:
falta = round(caf - moedas, 2)
mensagem = f"Saldo insuficiente. Faltam {falta:.2f} €."
elif moedas == caf:
mensagem = f"Aqui está o seu {v}.\nBom proveito!"
else:
troco = round(moedas - caf, 2)
mensagem = f"Aqui está o seu {v}.\nTroco: {troco:.2f} €.\nBom proveito!"

resultado_texto.config(text=mensagem)
except ValueError:
resultado_texto.config(text="Insira um valor numérico válido!")
def limpar():
Valor_moedas_entrada.delete(0, END)
resultado_texto.config(text="")
var.set(dropDownList[0])
atualizar_maquina(dropDownList[0]) titulo = Label(text="Máquina de Café",
font=("Arial", 28, "bold"),
bg="#103030", fg="#49e3e3")
titulo.place(relx=0.23, rely=0.05) texto_sub1 = Label(text="Valor colocado (€):",
font=("Arial", 16, "bold"),
bg="#103030", fg="#49e3e3")
texto_sub1.place(relx=0.1, rely=0.2) Valor_moedas = StringVar()
vcmd = (root.register(validar_entrada), "%P") Valor_moedas_entrada = Entry(
textvariable=Valor_moedas,
validate="key",
validatecommand=vcmd,
font=("Arial", 14),
justify='center'
)
Valor_moedas_entrada.place(relx=0.55, rely=0.21, relwidth=0.3)
Valor_moedas_entrada.focus() texto_sub2 = Label(text="Escolha o café:",
font=("Arial", 16, "bold"),
bg="#103030", fg="#49e3e3")
texto_sub2.place(relx=0.1, rely=0.35) var = StringVar()
dropDownList = list(maquina.keys())
var.set(dropDownList[0]) dropdown = OptionMenu(root, var, *dropDownList, command=atualizar_maquina)
dropdown.config(font=("Arial", 11), bg="#49e3e3")
dropdown.place(relx=0.55, rely=0.36, relwidth=0.35) texto_sub3 = Label(text="Preço do café:",
font=("Arial", 16, "bold"),
bg="#103030", fg="#49e3e3")
texto_sub3.place(relx=0.1, rely=0.5) valor_bem = Label(text="",
font=("Arial", 18, "bold"),
bg="#103030", fg="#f0f000")
valor_bem.place(relx=0.55, rely=0.5) Button(text="Pedir Café", font=("Arial", 12, "bold"), bg="#49e3e3",
command=mostrar_resultado).place(relx=0.1, rely=0.65, relwidth=0.25) Button(text="Limpar", font=("Arial", 12, "bold"),
command=limpar).place(relx=0.4, rely=0.65, relwidth=0.25) Button(text="Sair", font=("Arial", 12, "bold"), bg="#ff6666",
command=root.destroy).place(relx=0.7, rely=0.65, relwidth=0.25) resultado_texto = Label(bg="#cfe2f3", font=("Arial", 12, "italic"), wraplength=500)
resultado_texto.place(relx=0.05, rely=0.8, relwidth=0.9, relheight=0.15) atualizar_maquina(var.get())
root.mainloop()
0