Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import requests | |
| # Global variable to store calculation history | |
| history = [] | |
| def calculate(expression): | |
| try: | |
| # Use the full URL of your Hugging Face space | |
| api_url = "https://0learn-calcfastapi.hf.space/calculate" | |
| response = requests.post(api_url, json={"expr": expression}) | |
| if response.status_code == 200: | |
| result = response.json()["result"] | |
| result_str = f"{result:.8f}".rstrip('0').rstrip('.') | |
| global history | |
| history.append(f"{expression} = {result_str}") | |
| history = history[-5:] | |
| return "0", result_str, "\n".join(reversed(history)) | |
| else: | |
| error_data = response.json() | |
| error_message = error_data.get("detail", "An unknown error occurred") | |
| return expression, f"Error: {error_message}", "\n".join(reversed(history)) | |
| except requests.RequestException as e: | |
| return expression, f"Network Error: {str(e)}", "\n".join(reversed(history)) | |
| def update_expression(expression, value): | |
| if expression == "0" and value not in ['.', '(', ')']: | |
| return value | |
| if value in ['sin', 'cos', 'tan', 'log', 'ln', 'sqrt']: | |
| return expression + value + '(' | |
| return expression + value | |
| def backspace(expression): | |
| return expression[:-1] if len(expression) > 1 else "0" | |
| def clear(expression): | |
| return "0" | |
| css = """ | |
| .calculator-display { font-family: 'Digital-7', 'Courier New', monospace; font-size: 24px; } | |
| .calculator-result { font-family: 'Digital-7', 'Courier New', monospace; font-size: 72px; } | |
| .calculator-button { font-family: 'Arial', sans-serif; font-size: 18px; } | |
| .number-button { background-color: #e0e0e0; } | |
| .basic-op-button { background-color: #f0f0f0; } | |
| .advanced-op-button { background-color: #ffa500; } | |
| .calculator-box { border: 1px solid #ccc; padding: 10px; margin: 5px; border-radius: 5px; } | |
| """ | |
| def create_interface(): | |
| with gr.Blocks(css=css) as iface: | |
| gr.Markdown("# Scientific Calculator") | |
| with gr.Row(): | |
| with gr.Column(scale=2): | |
| display = gr.Textbox(value="0", label="Display", elem_classes=["calculator-display"]) | |
| with gr.Column(scale=1): | |
| result_display = gr.Textbox(value="", label="Result", elem_classes=["calculator-result"]) | |
| with gr.Row(): | |
| history_display = gr.Textbox(label="History (Last 5 Calculations)", lines=5) | |
| with gr.Row(): | |
| with gr.Column(scale=2): | |
| with gr.Column(elem_classes=["calculator-box"]): | |
| # Number pad (3x4 grid) | |
| for i in range(3): | |
| with gr.Row(): | |
| for j in range(3): | |
| num = str(7 - 3*i + j) | |
| gr.Button(num, elem_classes=["calculator-button", "number-button"]).click( | |
| lambda x, v=num: update_expression(x, v), inputs=display, outputs=display) | |
| with gr.Row(): | |
| gr.Button("0", elem_classes=["calculator-button", "number-button"]).click( | |
| lambda x: update_expression(x, "0"), inputs=display, outputs=display) | |
| gr.Button(".", elem_classes=["calculator-button", "number-button"]).click( | |
| lambda x: update_expression(x, "."), inputs=display, outputs=display) | |
| gr.Button("=", elem_classes=["calculator-button", "basic-op-button"]).click( | |
| calculate, inputs=display, outputs=[display, result_display, history_display]) | |
| with gr.Column(scale=1): | |
| with gr.Column(elem_classes=["calculator-box"]): | |
| # Basic operations | |
| for op, symbol in [("add", "+"), ("sub", "-"), ("mul", "*"), ("div", "/")]: | |
| gr.Button(symbol, elem_classes=["calculator-button", "basic-op-button"]).click( | |
| lambda x, v=symbol: update_expression(x, v), inputs=display, outputs=display) | |
| gr.Button("(", elem_classes=["calculator-button", "basic-op-button"]).click( | |
| lambda x: update_expression(x, "("), inputs=display, outputs=display) | |
| gr.Button(")", elem_classes=["calculator-button", "basic-op-button"]).click( | |
| lambda x: update_expression(x, ")"), inputs=display, outputs=display) | |
| gr.Button("C", elem_classes=["calculator-button", "basic-op-button"]).click( | |
| clear, inputs=display, outputs=display) | |
| gr.Button("⌫", elem_classes=["calculator-button", "basic-op-button"]).click( | |
| backspace, inputs=display, outputs=display) | |
| with gr.Column(scale=1): | |
| with gr.Column(elem_classes=["calculator-box"]): | |
| # Advanced operations | |
| for func in ["sin", "cos", "tan", "log", "ln", "sqrt"]: | |
| gr.Button(func, elem_classes=["calculator-button", "advanced-op-button"]).click( | |
| lambda x, v=func: update_expression(x, v), inputs=display, outputs=display) | |
| gr.Button("^", elem_classes=["calculator-button", "advanced-op-button"]).click( | |
| lambda x: update_expression(x, "^"), inputs=display, outputs=display) | |
| gr.Button("π", elem_classes=["calculator-button", "advanced-op-button"]).click( | |
| lambda x: update_expression(x, "pi"), inputs=display, outputs=display) | |
| gr.Button("e", elem_classes=["calculator-button", "advanced-op-button"]).click( | |
| lambda x: update_expression(x, "e"), inputs=display, outputs=display) | |
| return iface |