Spaces:
Sleeping
Sleeping
| # app.py | |
| # Simple Unit Converter (Gradio) - ready for Hugging Face Spaces | |
| import gradio as gr | |
| # ---------------------------- | |
| # Conversion data / helpers | |
| # ---------------------------- | |
| CONVERSIONS = { | |
| "Length": { | |
| "m": 1.0, | |
| "cm": 0.01, | |
| "mm": 0.001, | |
| "km": 1000.0, | |
| "in": 0.0254, | |
| "ft": 0.3048, | |
| "yd": 0.9144, | |
| "mi": 1609.344 | |
| }, | |
| "Mass": { | |
| "kg": 1.0, | |
| "g": 0.001, | |
| "mg": 1e-6, | |
| "lb": 0.45359237, | |
| "oz": 0.028349523125 | |
| }, | |
| "Volume": { | |
| "L": 1.0, | |
| "mL": 0.001, | |
| "m^3": 1000.0, | |
| "cup": 0.2365882365, | |
| "pt": 0.473176473, | |
| "gal": 3.785411784 | |
| }, | |
| "Temperature": ["C", "F", "K"] | |
| } | |
| def convert_linear(value: float, from_unit: str, to_unit: str, mapping: dict) -> float: | |
| if from_unit not in mapping or to_unit not in mapping: | |
| raise ValueError("Unknown unit for this category.") | |
| value_in_base = value * mapping[from_unit] | |
| return value_in_base / mapping[to_unit] | |
| def temp_to_c(value: float, unit: str) -> float: | |
| unit = unit.upper() | |
| if unit == "C": | |
| return value | |
| if unit == "F": | |
| return (value - 32.0) * 5.0 / 9.0 | |
| if unit == "K": | |
| return value - 273.15 | |
| raise ValueError("Unsupported temperature unit") | |
| def c_to_temp(celsius: float, unit: str) -> float: | |
| unit = unit.upper() | |
| if unit == "C": | |
| return celsius | |
| if unit == "F": | |
| return celsius * 9.0 / 5.0 + 32.0 | |
| if unit == "K": | |
| return celsius + 273.15 | |
| raise ValueError("Unsupported temperature unit") | |
| def convert_temperature(value: float, from_unit: str, to_unit: str) -> float: | |
| c = temp_to_c(value, from_unit) | |
| return c_to_temp(c, to_unit) | |
| # ---------------------------- | |
| # Gradio UI callbacks | |
| # ---------------------------- | |
| def update_unit_dropdowns(category: str): | |
| if category == "Temperature": | |
| units = CONVERSIONS["Temperature"] | |
| else: | |
| units = list(CONVERSIONS[category].keys()) | |
| from_default = units[0] | |
| to_default = units[1] if len(units) > 1 else units[0] | |
| return gr.update(choices=units, value=from_default), gr.update(choices=units, value=to_default) | |
| def perform_conversion(value, from_unit, to_unit, category): | |
| try: | |
| if value is None: | |
| return "Please enter a numeric value." | |
| if category == "Temperature": | |
| result = convert_temperature(float(value), from_unit, to_unit) | |
| return f"{result:.6g} {to_unit}" | |
| else: | |
| mapping = CONVERSIONS[category] | |
| result = convert_linear(float(value), from_unit, to_unit, mapping) | |
| return f"{result:.6g} {to_unit}" | |
| except Exception as e: | |
| return f"Error: {e}" | |
| # ---------------------------- | |
| # Build Gradio Blocks UI | |
| # ---------------------------- | |
| with gr.Blocks(title="Simple Unit Converter") as demo: | |
| gr.Markdown("## Simple Unit Converter\nConvert between Length, Mass, Volume and Temperature units.") | |
| category_dd = gr.Dropdown(choices=list(CONVERSIONS.keys()), label="Category", value="Length") | |
| from_dd = gr.Dropdown(choices=list(CONVERSIONS["Length"].keys()), label="From unit") | |
| to_dd = gr.Dropdown(choices=list(CONVERSIONS["Length"].keys()), label="To unit") | |
| val_in = gr.Number(value=1.0, label="Value to convert") | |
| convert_btn = gr.Button("Convert") | |
| result_out = gr.Textbox(label="Result", interactive=False) | |
| category_dd.change(fn=update_unit_dropdowns, inputs=category_dd, outputs=[from_dd, to_dd]) | |
| convert_btn.click(fn=perform_conversion, inputs=[val_in, from_dd, to_dd, category_dd], outputs=result_out) | |
| # IMPORTANT for Spaces: do NOT use share=True (that's for Colab). | |
| if __name__ == "__main__": | |
| demo.launch() | |