Basic Calculator using Python GUI (Tkinter) Program

Python GUI Calculator

This is a simple graphical user interfaced (GUI) Python application designed using Tkinter package to perform basic arithmetic calculations such as addition, subtraction, multiplication, and division of two numbers through the mouse click event. Copy an icon image ‘favicon.ico’ to the working directory to change the default icon in the title bar of the application.

Introduction to Python Tkinter

In Python, the tkinter package (“Tcl/Tk interface”) is the standard interface to the Tk GUI toolkit. Both Tk and tkinter are available on most Unix platforms, as well as on Windows systems. (Tk itself is not part of Python; it is maintained at ActiveState.) You can check that tkinter is properly installed on your system by running python -m tkinter from the command line; this should open a window demonstrating a simple Tk interface. For more details, refer to the official site of Python (python.org).

Source Code

# calc.py - a Python calculator
from tkinter import *

# the main class
class Calc():
  def __init__(self):
    self.total = 0
    self.current = ""
    self.new_num = True
    self.op_pending = False
    self.op = ""
    self.eq = False

  def num_press(self, num):
    self.eq = False
    temp = text_box.get()
    temp2 = str(num)    
    if self.new_num:
      self.current = temp2
      self.new_num = False
    else:
      if temp2 == '.':
        if temp2 in temp:
          return
      self.current = temp + temp2
    self.display(self.current)

  def calc_total(self):
    self.eq = True
    self.current = float(self.current)
    if self.op_pending == True:
      self.do_sum()
    else:
      self.total = float(text_box.get())

  def display(self, value):
    text_box.delete(0, END)
    text_box.insert(0, value)

  def do_sum(self):
    if self.op == "add":
      self.total += self.current
    if self.op == "minus":
      self.total -= self.current
    if self.op == "times":
      self.total *= self.current
    if self.op == "divide":
      self.total /= self.current
    self.new_num = True
    self.op_pending = False
    self.display(self.total)

  def operation(self, op): 
    self.current = float(self.current)
    if self.op_pending:
      self.do_sum()
    elif not self.eq:
      self.total = self.current
    self.new_num = True
    self.op_pending = True
    self.op = op
    self.eq = False

  def cancel(self):
    self.eq = False
    self.current = "0"
    self.display(0)
    self.new_num = True

  def all_cancel(self):
    self.cancel()
    self.total = 0
  
  def sign(self):
    self.eq = False
    self.current = -(float(text_box.get()))
    self.display(self.current)

sum1 = Calc()
root = Tk()
calc = Frame(root)
calc.grid()

root.title("Calculator")
root.wm_iconbitmap('favicon.ico')
root.resizable(width=FALSE, height=FALSE)
text_box = Entry(calc, justify = RIGHT, bd = 2, fg = "black")
text_box.grid(row = 0, column = 0, columnspan = 4, pady = 5)
text_box.insert(0, "0")

# make the buttons
numbers = "789456123"
i = 0
bttn = []
for j in range(1,4):
  for k in range(3):
    bttn.append(Button(calc, text = numbers[i], width=3, height=1))
    bttn[i].grid(row = j, column = k, padx = 5, pady = 5)
    bttn[i]["command"] = lambda x = numbers[i]: sum1.num_press(x)
    i += 1

bttn_0 = Button(calc, text = "0", width=3, height=1)
bttn_0["command"] = lambda: sum1.num_press(0)
bttn_0.grid(row = 4, column = 0, padx = 5, pady = 5)

bttn_div = Button(calc, text = chr(247), width=3, height=1)
bttn_div["command"] = lambda: sum1.operation("divide")
bttn_div.grid(row = 1, column = 3, padx = 5, pady = 5)

bttn_off = Button(calc, text = "OFF", width=3, height=1)
bttn_off["command"] = root.destroy
bttn_off.grid(row = 5, column = 0, padx = 5, pady = 5)

bttn_mult = Button(calc, text = chr(215), width=3, height=1)
bttn_mult["command"] = lambda: sum1.operation("times")
bttn_mult.grid(row = 2, column = 3, padx = 5, pady = 5)

minus = Button(calc, text = "-", width=3, height=1)
minus["command"] = lambda: sum1.operation("minus")
minus.grid(row = 3, column = 3, padx = 5, pady = 5)

point = Button(calc, text = ".", width=3, height=1)
point["command"] = lambda: sum1.num_press(".")
point.grid(row = 4, column = 1, padx = 5, pady = 5)

add = Button(calc, text = "+", width=3, height=1)
add["command"] = lambda: sum1.operation("add")
add.grid(row = 4, column = 3, padx = 5, pady = 5)

neg= Button(calc, text =  chr(177), width=3, height=1)
neg["command"] = sum1.sign
neg.grid(row = 5, column = 3, padx = 5, pady = 5)

clear = Button(calc, text = "C", width=3, height=1)
clear["command"] = sum1.cancel
clear.grid(row = 5, column = 1, padx = 5, pady = 5)

all_clear = Button(calc, text = "AC", width=3, height=1)
all_clear["command"] = sum1.all_cancel
all_clear.grid(row = 5, column = 2, padx = 5, pady = 5)

equals = Button(calc, text = "=", width=3, height=1)
equals["command"] = sum1.calc_total
equals.grid(row = 4, column = 2, padx = 5, pady = 5)

root.mainloop()

Comments

Most Popular Posts

Technical Questions

RNA to Protein Translation in PERL

Simple Server and Client Chat using Python