import gradio as gr import pubchempy as pcp def get_chemical_info(chemical_name): try: compound = pcp.get_compounds(chemical_name, 'name')[0] output = [] output.append(f"IUPAC Name: {compound.iupac_name}") output.append(f"Common Name: {compound.synonyms[0]}") output.append(f"Synonyms: {', '.join(compound.synonyms[:4])}") output.append(f"Formula: {compound.molecular_formula}") output.append(f"Molecular Weight: {compound.molecular_weight}") output.append(f"Exact Molecular Weight: {compound.exact_mass}") output.append(f"Isotope Atom Count: {compound.isotope_atom_count}") output.append(f"Charge: {compound.charge}") # Atoms output.append("\nAtoms:") atom_dict = {i + 1: atom.element for i, atom in enumerate(compound.atoms)} for idx, element in atom_dict.items(): output.append(f" Atom {idx}: Element = {element}") # Bonds output.append("\nBonds:") for bond in compound.bonds: atom1 = atom_dict.get(bond.aid1, f"Atom {bond.aid1}") atom2 = atom_dict.get(bond.aid2, f"Atom {bond.aid2}") output.append(f" Bond between {atom1} and {atom2}, Order: {bond.order}") final_text = "\n".join(output) # Save to a file file_path = f"/tmp/{chemical_name.replace(' ', '_')}_info.txt" with open(file_path, "w") as f: f.write(final_text) return final_text, file_path except IndexError: return f"No information found for '{chemical_name}'. Please try a more precise name.", None # Gradio UI with gr.Blocks(title="ChemQuery: Learn Molecules Easily") as demo: gr.Markdown("## ChemQuery: Learn Molecules Easily") gr.Markdown( """ Enter a chemical name to explore its molecular formula, synonyms, atomic structure, and bonding details. ChemQuery is Powered by PubChem & PubChemPy — designed to make chemistry learning simple and fun for students, teachers, and curious minds alike. If you find this initiative helpful, please: - ❤️ Give it a like - 🔁 Share it with your friends, classmates, or educators - ⭐ Star the GitHub repo: [ChemQuery](https://github.com/RezuwanHassan262/ChemQuery/tree/main) > _“ChemQuery is a free and open-source chemistry learning tool built as part of an educational initiative to support students worldwide.”_ Let's spread the love for science and open knowledge! 🌍🧪✨ """ ) with gr.Row(): chemical_input = gr.Textbox(label="Enter Chemical Name", lines=1, scale=5) submit_btn = gr.Button("Submit", scale=1, elem_id="submit-btn") gr.Markdown( """ """ ) output_text = gr.Textbox(label="Compound Information", lines=25) download_file = gr.File(label="Download as TXT") submit_btn.click(get_chemical_info, inputs=chemical_input, outputs=[output_text, download_file]) demo.launch()