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