Spaces:
Sleeping
Sleeping
File size: 5,882 Bytes
a01a1ba ceed8aa c54abcf a01a1ba 7fab4fa 54c0a26 a01a1ba 54c0a26 a01a1ba bbe6808 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
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 |