import tkinter as tk
from tkinter import messagebox
# =========== Variables ================
vars = {
"counter": 1,
"valid_op": "+,-,*,**,/,//,%,==,!=,<,<=,>,>=",
}
# =========== Functions ================
def save_event(event):
lbl_rsl.config(text=event)
lst_hst.insert(0, event)
def showerror(title, msg):
save_event(f"{title}:\n{msg}")
messagebox.showerror(title=title, message=msg)
def clear_entries():
ntr_n1.delete(0, tk.END)
ntr_n2.delete(0, tk.END)
ntr_op.delete(0, tk.END)
def clear_events():
lst_hst.delete(0, tk.END)
def selection(event):
selection = lst_hst.curselection()
index = selection[0]
lbl_rsl.config(text=lst_hst.get(index))
def remove():
selection = lst_hst.curselection()
if not selection:
return
index = selection[0]
lst_hst.delete(index)
def close():
root.destroy()
def opration(n1, n2, op):
n1_op_n2 = {
"+": n1 + n2,
"-": n1 - n2,
"*": n1 * n2,
"**": n1**n2,
"/": n1 / n2,
"//": n1 // n2,
"%": n1 % n2,
"==": n1 == n2,
"!=": n1 != n2,
"<": n1 < n2,
"<=": n1 <= n2,
">": n1 > n2,
">=": n1 >= n2,
}
return f"{n1} {op} {n2} = {n1_op_n2[op]}"
def calculate():
try:
n1 = ntr_n1.get()
n1 = float(n1)
n2 = ntr_n2.get()
n2 = float(n2)
op = ntr_op.get()
if op not in vars["valid_op"].split(","):
title = f"{op} عملگر معتبر نیست!"
msg = f"عملگرهای معتبر: " + vars["valid_op"]
showerror(title, msg)
return
title = vars["counter"]
msg = opration(n1, n2, op)
save_event(f"{title}:\n{msg}")
vars["counter"] += 1
except ZeroDivisionError:
title = f"خطا تقسیم بر صفر"
msg = f"حاصل {n1} {op} {n2} تعریف نشده است!"
showerror(title, msg)
except ValueError:
title = f"خطا مقدار"
msg = f"لطفا مقدار معتبر وارد کنید!"
showerror(title, msg)
except Exception as e:
title = f"خطا"
msg = str(e)
showerror(title, msg)
# =========== GUI ================
root = tk.Tk()
root.title("ماشین حساب")
root.geometry("400x400")
frm_n1 = tk.Frame(root)
frm_n1.pack(pady=2)
lbl_n1 = tk.Label(frm_n1, text="عدد اول:")
lbl_n1.pack(side="right", padx=2)
ntr_n1 = tk.Entry(frm_n1)
ntr_n1.pack(side="right", padx=2)
frm_n2 = tk.Frame(root)
frm_n2.pack(pady=2)
lbl_n2 = tk.Label(frm_n2, text="عدد دوم:")
lbl_n2.pack(side="right", padx=2)
ntr_n2 = tk.Entry(frm_n2)
ntr_n2.pack(side="right", padx=2)
frm_op = tk.Frame(root)
frm_op.pack(pady=2)
lbl_op = tk.Label(frm_op, text="عملگر:")
lbl_op.pack(side="right", padx=2)
ntr_op = tk.Entry(frm_op)
ntr_op.pack(side="right", padx=2)
tk.Button(
root,
text="محاسبه",
command=calculate,
).pack(pady=5)
lbl_rsl = tk.Label(root, text="---")
lbl_rsl.pack(pady=5)
frm_lst = tk.Frame(root)
frm_lst.pack(padx=5)
scb = tk.Scrollbar(
frm_lst,
cursor="hand1",
)
scb.pack(side="right", fill="y", pady=5)
lst_hst = tk.Listbox(
frm_lst,
height=10,
width=50,
yscrollcommand=scb.set,
)
lst_hst.bind("<Double-1>", selection)
lst_hst.pack(side="right", pady=5, padx=5)
scb.config(command=lst_hst.yview)
frm_btn = tk.Frame(root)
frm_btn.pack(pady=5)
tk.Button(
frm_btn,
text="حذف رویداد",
command=remove,
).pack(side="right", padx=5)
tk.Button(
frm_btn,
text="حذف کل رویدادها",
command=clear_events,
).pack(side="right", padx=5)
tk.Button(
frm_btn,
text="بستن",
command=close,
).pack(side="right", padx=5)
root.mainloop()