-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.py
109 lines (82 loc) · 3.58 KB
/
app.py
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
#!/usr/bin/python3
from tkinter import *
import parser
graphic = Tk()
graphic.title("Calculator")
# icon = "./calculator-1.png"
# graphic.iconbitmap(icon)
# graphic.tk.call('wm', 'iconphoto', graphic._w, graphic.PhotoImage(file='calculator-1.png'))
display = Entry(graphic)
display.grid(row=1, columnspan=6, sticky=W+E)
# code
index = 0
# numbers commands
def get_numbers(n):
global index
display.insert(index, n)
index +=1
# operations command
def get_operations(operator):
global index
operator_len = len(operator)
display.insert(index, operator)
index+=operator_len
# clear
def clear_calculator():
display.delete(0, END)
# undo
def undo():
display_status = display.get()
if len(display_status):
display_status_new = display_status[:-1]
clear_calculator()
display.insert(0, display_status_new)
else:
clear_calculator()
display.insert(0, "ERROR")
# result
def result():
display_status = display.get()
try:
expression = parser.expr(display_status).compile()
result_operation = eval(expression)
clear_calculator()
display.insert(0, result_operation)
except expression as identifier:
clear_calculator()
display.insert(0, "Syntax ERROR")
# grapic code
# colors
graphic.configure(bg='#302c2c')
# geometry
graphic.geometry('265x150')
# number buttons row one
Button(graphic, text="1", command=lambda:get_numbers("1")).grid(row=2, column=0, sticky=W+E)
Button(graphic, text="2", command=lambda:get_numbers("2")).grid(row=2, column=1, sticky=W+E)
Button(graphic, text="3", command=lambda:get_numbers("3")).grid(row=2, column=2, sticky=W+E)
# number buttons row two
Button(graphic, text="4", command=lambda:get_numbers("4")).grid(row=3, column=0, sticky=W+E)
Button(graphic, text="5", command=lambda:get_numbers("5")).grid(row=3, column=1, sticky=W+E)
Button(graphic, text="6", command=lambda:get_numbers("6")).grid(row=3, column=2, sticky=W+E)
# number buttons row three
Button(graphic, text="7", command=lambda:get_numbers("7")).grid(row=4, column=0, sticky=W+E)
Button(graphic, text="8", command=lambda:get_numbers("8")).grid(row=4, column=1, sticky=W+E)
Button(graphic, text="9", command=lambda:get_numbers("9")).grid(row=4, column=2, sticky=W+E)
# number buttons row five
Button(graphic, text="0", command=lambda:get_numbers("0")).grid(row=5, column=1, sticky=W+E)
# other buttons
Button(graphic, text="AC", command=lambda:clear_calculator()).grid(row=5, column=2, sticky=W+E)
Button(graphic, text="%", command=lambda:get_operations("%")).grid(row=5, column=0, sticky=W+E)
Button(graphic, text="←", command=lambda:undo()).grid(row=2, column=4, sticky=W+E, columnspan=2)
Button(graphic, text="EXP", command=lambda:get_operations("**")).grid(row=3, column=4, sticky=W+E)
Button(graphic, text="^2", command=lambda:get_operations("**2")).grid(row=3, column=5, sticky=W+E)
Button(graphic, text="(", command=lambda:get_operations("(")).grid(row=4, column=4, sticky=W+E)
Button(graphic, text=")", command=lambda:get_operations(")")).grid(row=4, column=5, sticky=W+E)
Button(graphic, text="=", command=lambda:result()).grid(row=5, column=4, sticky=W+E, columnspan=2)
# operation buttons
Button(graphic, text="+", command=lambda:get_operations("+")).grid(row=2, column=3, sticky=W+E)
Button(graphic, text="-", command=lambda:get_operations("-")).grid(row=3, column=3, sticky=W+E)
Button(graphic, text="*", command=lambda:get_operations("*")).grid(row=4, column=3, sticky=W+E)
Button(graphic, text="/", command=lambda:get_operations("/")).grid(row=5, column=3, sticky=W+E)
# mainloop
graphic.mainloop()