Sunday, August 30, 2015

Python: Tkinter (6) calculator

Abstract: A GUI calculator software

The GUI:

The script:

# -*- coding: utf-8 -*-
"""
Created on Sat Aug 29 15:27:11 2015

@author: yuan
"""



from Tkinter import *

#
class basicFUN:
    def __init__(self, root):
        self.root=root
        pass
   
    def frame(self, side):
        win = Frame(self.root)
        win.pack(side=side, expand=YES, fill=BOTH)
        return win

    def button(self, side, text, command=None):
        win = Button(self.root, text=text, command=command)
        win.pack(side=side, expand=YES, fill=BOTH)
        return win
       
    def entry(self, side,label_text=None, entry_text=None):
        #set entry frame with a label and an entry
        entryF=self.frame(side)
        #entry label
        if label_text is not None:
            Label(entryF, text=label_text).pack(side=LEFT, padx=5, pady=10)
        #entry display
        e = StringVar()
        Entry(entryF, relief=SUNKEN,textvariable=e).pack(side=LEFT, expand=YES, fill=BOTH)
        if entry_text is not None:
            e.set(entry_text)
        return e       
#calculator
class Calculator(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.option_add('*Font', 'Verdana 12 bold')
        self.pack(expand=YES, fill=BOTH)
        self.master.title('Calculator')
        self.master.iconname("calc")
       
        #entry display
        entry=basicFUN(self).entry(TOP)
       
        #button
        for key in ("123", "456", "789", "-0."):
            keyF = basicFUN(self).frame(TOP)
            for char in key:
                basicFUN(keyF).button(LEFT, char,
                       lambda w=entry, c=char: w.set(w.get() + c))
        #button
        opsF = basicFUN(self).frame(TOP)
        for char in "+-*/%":
            btn = basicFUN(opsF).button(LEFT, char,
                   lambda w=entry, s=' %s '%char: w.set(w.get()+s))
                  
        #clear and backspace buttons
        clearF = basicFUN(self).frame(TOP)
        basicFUN(clearF).button(LEFT, 'Back', lambda w=entry: w.set(w.get()[:-1]))
        basicFUN(clearF).button(LEFT, 'Clear', lambda w=entry: w.set(''))
       
        #equal button
        opsF=basicFUN(self).frame(TOP)
        btn = basicFUN(opsF).button(LEFT, '=')
        btn.bind('<ButtonRelease-1>', lambda e, s=self, w=entry: s.calc(w), '+')
    #operations from entry   
    def calc(self, display):
        try:
            result=eval(display.get()+'+0.0') #return float type
            #print display.get()+'+0.0'
            display.set(result)
        except:
            display.set("ERROR")

#main program
if __name__ == '__main__':
    Calculator().mainloop()

No comments:

Post a Comment