Mundo em Python

Visualizar a Fórmula em Notação Química

from tkinter import *
elementos_validos = {
'H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne',
'Na', 'Mg', 'Al', 'Si', 'P', 'S', 'Cl', 'Ar',
'K', 'Ca', 'Sc', 'Ti', 'V', 'Cr', 'Mn', 'Fe', 'Co', 'Ni',
'Cu', 'Zn', 'Ga', 'Ge', 'As', 'Se', 'Br', 'Kr',
'Rb', 'Sr', 'Y', 'Zr', 'Nb', 'Mo', 'Tc', 'Ru', 'Rh', 'Pd',
'Ag', 'Cd', 'In', 'Sn', 'Sb', 'Te', 'I', 'Xe',
'Cs', 'Ba', 'La', 'Ce', 'Pr', 'Nd', 'Pm', 'Sm', 'Eu', 'Gd',
'Tb', 'Dy', 'Ho', 'Er', 'Tm', 'Yb', 'Lu', 'Hf', 'Ta', 'W',
'Re', 'Os', 'Ir', 'Pt', 'Au', 'Hg', 'Tl', 'Pb', 'Bi', 'Po',
'At', 'Rn', 'Fr', 'Ra', 'Ac', 'Th', 'Pa', 'U', 'Np', 'Pu',
'Am', 'Cm', 'Bk', 'Cf', 'Es', 'Fm', 'Md', 'No', 'Lr',
'Rf', 'Db', 'Sg', 'Bh', 'Hs', 'Mt', 'Ds', 'Rg', 'Cn',
'Nh', 'Fl', 'Mc', 'Lv', 'Ts', 'Og'
}
def formatar_formula(formula):
subscritos = str.maketrans("0123456789", "₀₁₂₃₄₅₆₇₈₉")
return formula.translate(subscritos)
def validar_e_extrair_elementos(formula_str):
elementos_encontrados = []
erros_detectados = set()
i = 0
while i < len(formula_str):
matched = False
if i + 1 < len(formula_str):
potential_two_char_sym = formula_str[i:i + 2]
if potential_two_char_sym in elementos_validos:
elementos_encontrados.append(potential_two_char_sym)
i += 2
matched = True

if not matched:
potential_one_char_sym = formula_str[i]
if potential_one_char_sym in elementos_validos:
elementos_encontrados.append(potential_one_char_sym)
i += 1
matched = True
elif potential_one_char_sym.isdigit():
while i < len(formula_str) and formula_str[i].isdigit():
i += 1
matched = True
elif potential_one_char_sym.isspace():
i += 1
matched = True
elif potential_one_char_sym == '(' or potential_one_char_sym == ')':
i += 1
matched = True
if not matched:
problem_start = i
while i < len(formula_str) and \
not (formula_str[i].isupper() and \
(formula_str[i] in elementos_validos or \
(i + 1 < len(formula_str) and formula_str[i:i + 2] in elementos_validos))) and \
not formula_str[i].isdigit() and \
not formula_str[i].isspace() and \
not (formula_str[i] == '(' or formula_str[i] == ')'):
i += 1
problematic_sequence = formula_str[problem_start:i]
if problematic_sequence:
erros_detectados.add(f"'{problematic_sequence}'")
if problem_start == i:
i += 1

return elementos_encontrados, list(erros_detectados)
root = Tk()
root.geometry("700x300")
root.resizable(0, 0)
root.config(bg="#103030")
root.title("Visualizar a Fórmula em Notação Química") titulo = Label(text="Visualizar a Fórmula em Notação Química",
font=("Arial", "22", "bold"), bg="#103030", fg="#49e3e3")
titulo.place(relx=0.05, rely=0.05) texto_sub1 = Label(text="Fórmula:",
font=("Arial", 18, "bold"), bg="#103030", fg="#49e3e3")
texto_sub1.place(relx=0.25, rely=0.32) Fórmula = StringVar()
Fórmula_entrada = Entry(textvariable=Fórmula,
font=("Arial", 12, "bold"),
bg="white", fg="blue", justify='center')
Fórmula_entrada.place(relx=0.5, rely=0.33, relwidth=0.35)
def limpar():
Fórmula_entrada.delete(0, END)
resultado_texto.config(text="")
def app():
formula = Fórmula_entrada.get().strip() if not formula:
resultado_texto.config(text="Erro: Por favor, insira uma fórmula.")
return
elementos_encontrados, erros_detectados = validar_e_extrair_elementos(formula) if erros_detectados:
resultado_texto.config(text=f"Erro: Caractere(s) ou sequência(s) inválida(s): {', '.join(erros_detectados)}")
elif not elementos_encontrados and formula:
resultado_texto.config(text="Erro: Nenhuma notação de elemento químico válida encontrada.")
else:
formula_formatada = formatar_formula(formula)
resultado_texto.config(text=formula_formatada)
def copiar_texto():
texto = resultado_texto.cget("text")
if texto and not texto.startswith("Erro:"): # Não copiar mensagens de erro
root.clipboard_clear()
root.clipboard_append(texto)
resultado_texto.config(text=f"{texto} (copiado!)")
elif texto.startswith("Erro:"):
resultado_texto.config(text=f"Não é possível copiar o texto de erro. Insira uma fórmula válida.") but1 = Button(text="Mostrar", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=app)
but1.place(relx=0.1, rely=0.5, 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.5, 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.5, relwidth=0.25, relheight=0.1) but_copiar = Button(text="Copiar", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=copiar_texto)
but_copiar.place(relx=0.4, rely=0.63, relwidth=0.25, relheight=0.1)
resultado_texto = Label(text="",
font=("Arial", 20, "bold"), bg="#cfe2f3", fg="black", anchor="center")
resultado_texto.place(relx=0.05, rely=0.8, relwidth=0.9, relheight=0.15)
root.mainloop()
0