from tkinter import *
from tkinter import messagebox
root = Tk()
root.geometry("700x400")
root.resizable(0, 0)
root.config(bg="#103030")
root.title("Preço por quilo com base no preço por x gramas")
titulo = Label(
text="Calcular Preço por Quilo",
font=("Arial", 28, "bold"),
bg="#103030",
fg="#49e3e3"
)
titulo.place(relx=0.18, rely=0.05)
texto_sub1 = Label(
text="Preço total (€):",
font=("Arial", 20, "bold"),
bg="#103030",
fg="#49e3e3"
)
texto_sub1.place(relx=0.3, rely=0.28)
texto_sub2 = Label(
text="Peso total (em gramas):",
font=("Arial", 20, "bold"),
bg="#103030",
fg="#49e3e3"
)
texto_sub2.place(relx=0.05, rely=0.45)
Preço_total = StringVar()
peso_total_gramas = StringVar()
Preço_total_entrada = Entry(
textvariable=Preço_total,
font=("Arial", 12, "bold"),
bg="white",
fg="blue",
justify='center'
)
Preço_total_entrada.place(relx=0.6, rely=0.29, relwidth=0.3)
Preço_total_entrada.focus()
peso_total_gramas_entrada = Entry(
textvariable=peso_total_gramas,
font=("Arial", 12, "bold"),
bg="white",
fg="blue",
justify='center'
)
peso_total_gramas_entrada.place(relx=0.55, rely=0.46, relwidth=0.34)
def limpar():
peso_total_gramas_entrada.delete(0, END)
Preço_total_entrada.delete(0, END)
resultado_texto.delete(1.0, END)
def app():
try:
peso = float(peso_total_gramas.get().replace(',', '.'))
preco = float(Preço_total.get().replace(',', '.'))
# 2. Verifica se o peso é zero ou negativo para evitar divisão por zero.
if peso <= 0:
messagebox.showerror("Erro de Valor", "O peso deve ser maior que zero para o cálculo.")
return
# Cálculos
preco_por_grama = preco / peso
preco_por_100g = preco_por_grama * 100
preco_por_kg = preco_por_grama * 1000
# Mensagem formatada (usando round() conforme sua preferência)
mensagem = (
f"Preço total: {round(preco,2)} € | Peso: {peso:.0f} g\n"
f"Preço por grama: {round(preco_por_grama,4)} €\n"
f"Preço por 100g: {round(preco_por_100g,2)} €\n"
f"Preço por quilo: {round(preco_por_kg,2)} €\n"
)
resultado_texto.insert(END, mensagem)
resultado_texto.see(END) # Rola para a última mensagem inserida
except ValueError:
# Usa messagebox para alertar sobre entradas não numéricas.
messagebox.showerror("Erro de Entrada", "Por favor, insira valores numéricos válidos (use ponto ou vírgula para decimais).")
resultado_texto.insert(END, "⚠️ Por favor, insira valores numéricos válidos.\n")
except Exception as e:
messagebox.showerror("Erro", f"Ocorreu um erro inesperado: {e}")
resultado_texto.insert(END, f"❌ Erro: {e}\n")
# Botões
but1 = Button(
text="Calcular",
bd=2,
bg='#107db2',
fg='white',
font=('verdana', 12, 'bold'),
command=app
)
but1.place(relx=0.1, rely=0.65, relwidth=0.25, relheight=0.1)
but_limpar = Button(
text="Limpar",
bd=2,
bg='#107db2',
fg='white',
font=('verdana', 12, 'bold'),
command=limpar
)
but_limpar.place(relx=0.4, rely=0.65, relwidth=0.25, relheight=0.1)
but_sair = Button(
text="Sair",
bd=2,
bg='#107db2',
fg='white',
font=('verdana', 12, 'bold'),
command=root.destroy
)
but_sair.place(relx=0.7, rely=0.65, relwidth=0.25, relheight=0.1)
frame_resultado = Frame(root, bg="#cfe2f3")
frame_resultado.place(relx=0.05, rely=0.8, relwidth=0.9, relheight=0.15)
scrollbar = Scrollbar(frame_resultado)
scrollbar.pack(side=RIGHT, fill=Y)
resultado_texto = Text(
frame_resultado,
font=("Arial", 12, "bold"),
bg="#cfe2f3",
yscrollcommand=scrollbar.set,
wrap=WORD
)
resultado_texto.pack(side=LEFT, fill=BOTH, expand=True)
scrollbar.config(command=resultado_texto.yview)
root.mainloop()