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