面向对象简易计算器
import tkinter
import math
import tkinter.messagebox
class jsq:
#界面布局方法
def __init__(self):
#创建界面
self.root = tkinter.Tk()
self.root.minsize(280,420)
self.root.title('chy计算器')
#调用方法
self.showlabel()
self.myfunc()
self.root.resizable(width = False, height = False)
self.root.mainloop()
def myfunc(self):
print('执行操作')
#添加菜单
#创建总菜单
allmenu = tkinter.Menu(self.root)
#创建查看菜单
filemenu= tkinter.Menu(allmenu,tearoff=0)
#添加查看子菜单
filemenu.add_command(label='标准型(T) Alt+1',command = self.myfunc)
filemenu.add_command(label='科学型(S) Alt+2',command = self.myfunc)
filemenu.add_command(label='程序员(P) Alt+3',command = self.myfunc)
filemenu.add_command(label='统计信息(A) Alt+4',command = self.myfunc)
#分割线
filemenu.add_separator()
filemenu.add_command(label='历史记录(Y) Ctrl+H',command = self.myfunc)
filemenu.add_command(label='数字分组(I)',command = self.myfunc)
#分割线
filemenu.add_separator()
filemenu.add_command(label='基本(B) Ctrl+F',command = self.myfunc)
filemenu.add_command(label='单位转换(U) Ctrl+U',command = self.myfunc)
filemenu.add_command(label='日期计算(D) Ctrl+E',command = self.myfunc)
#分割线
filemen= tkinter.Menu(allmenu,tearoff=0)
filemenu.add_cascade(label='工作表(W)',menu =filemen)
#创建工作表下的子菜单
filemen.add_command(label='抵押(M)',command = self.myfunc)
filemen.add_command(label='汽车租赁(D)',command = self.myfunc)
filemen.add_command(label='油耗(mpg)(F)',command = self.myfunc)
filemen.add_command(label='油耗(U)',command = self.myfunc)
#将查看菜单放入总菜单中
allmenu.add_cascade(label='查看(V)',menu=filemenu)
#创建编辑总菜单
editmenu= tkinter.Menu(allmenu,tearoff=0)
editmenu.add_command(label='复制(C) Ctrl+C',command= self.myfunc)
editmenu.add_command(label='粘贴(P) Ctrl+V',command= self.myfunc)
#分割线
editmenu.add_separator()
editmenu.add_command(label='历史记录(H)',command = self.myfunc)
#将编辑菜单加入总菜单
allmenu.add_cascade(label='编辑(E)',menu=editmenu)
#创建帮助菜单
helpmenu= tkinter.Menu(allmenu,tearoff=0)
helpmenu.add_command(label='查看帮助(V) Ctrl+F1',command = self.myfunc)
#分割线
helpmenu.add_separator()
helpmenu.add_command(label='关于计算器(A)',command = self.myfunc)
#将帮总菜单助菜单加入
allmenu.add_cascade(label='帮助(H)',menu=helpmenu)
#摆放菜单
self.root.config(menu = allmenu)
# 设置一个全局变量 运算数字和f符号的列表
lists = []
# 添加一个用于判断是否按下运算符号的标志
isPressSign = False
# 添加一个等于号的标志
pressEqual = False
#操作函数
#数字函数
def pressNum(self,num):
#全局变量
global lists
global isPressSign
# 判断是否按下了运算符号
if self.isPressSign == False:
pass
else:
self.result.set(0)
# 重置运算符号的状态
self.isPressSign = False
# 获取面板中的原有数字
oldnum = self.result.get()
# 判断界面数字是否为0
if oldnum == '0':
self.result.set(num)
else:
# 链接上 新按下的数字
newnum = oldnum + num
# 将按下的数字写到面板中
self.result.set(newnum)
# 运算函数
def pressCompute(self,sign):
# 保存已经按下的数字和运算符号
# 获取界面数字
num = self.result.get()
self.lists.append(num)
# 保存按下的操作符号
self.lists.append(sign)
# 设置运算符号为按下状态)
self.isPressSign = True
# 获取运算结果
def pressEqual(self):
# 全局化操作
global lists
# 获取所有的列表中的内容(之前的数字和操作)
# 获取当前界面尚的数字
curnum = self.result.get()
# 将当前界面的数数字存入列表
self.lists.append(curnum)
# 将列表转化为字符串
computeStr = ''.join(self.lists)
# 使用eval执行字符串中的运算即可
endNum = eval(computeStr)
# 将运算结果显式到界面中
self.result.set(endNum)
# 清空运算列表
self.lists.clear()
#MC键
def pressMc(self):
tkinter.messagebox.showerror(title='MC键',message='无法定义按键')
#MR键
def pressMr(self):
tkinter.messagebox.showerror(title='MR键',message='无法定义按键')
#MS键
def pressMs(self):
tkinter.messagebox.showerror(title='MS键',message='无法定义按键')
#M+键
def pressAdd(self):
tkinter.messagebox.showerror(title='M+键',message='无法定义按键')
#M-键
def pressSub(self):
tkinter.messagebox.showerror(title='M-键',message='无法定义按键')
#删除键(←)
def pressDelete(self):
#获取当前数的长度
len1 = len(self.result.get())
#判断长度是否大于1
if len1 > 1:
#每次执行按键功能,取片去除最后一位数,再输出显示
num1 = self.result.get()
num1 = num1[:len1-1]
self.result.set(num1)
# 清除键(CE)
def pressCE(self):
self.result.set(0)
#清除键(C)
def pressClear(self):
self.result.set(0)
#正负号键(±)
def pressSign(self):
# 获取当前的数,乘-1后输出到当前显示
if float(self.result.get()) == 0:
self.result.set(0)
else:
self.result.set(-1*float(self.result.get()))
#根号键(√)
def pressSqrt(self):
#获取当前的数,根平方后输出到当前显示
if float(self.result.get()) <= 0:
self.result.set('请输入大于0的整数')
else:
self.result.set(math.sqrt(float(self.result.get())))
#倒数键(1/x)
def pressRec(self):
if float(self.result.get()) == 0:
self.result.set(0)
else:
self.result.set(1/float(self.result.get()))
#小数点键(.)
def pressDec(self,Del):
# 判断小数点是否被按下
if '.' in self.result.get():
pass
else:
self.result.set(self.result.get() + Del)
# 判断等号是否被按下
if self.pressEqual == True:
self.result.set('0' + Del)
# 重置运算符状态
self.pressEqual = False
# 判断运算符是否被按下
if self.isPressSign == True:
self.result.set('0' + Del)
#重置运算符状态
self.isPressSign = False
def showlabel(self):
#界面布局
#按钮show
self.result = tkinter.StringVar()
self.result.set(0)
show = tkinter.Label(self.root,textvariable=self.result,bg = 'white',font = ('黑体',20),anchor = 'e')
show.place(x = 5, y = 5,width = 270)
#第一行
btn = tkinter.Button(self.root,text = 'MC',command = self.pressMc)
btn.place(x = 5, y = 60, width = 50, height = 50)
btn = tkinter.Button(self.root,text = 'MR',command = self.pressMr)
btn.place(x = 60, y = 60, width = 50, height = 50)
btn = tkinter.Button(self.root,text = 'MS',command = self.pressMs)
btn.place(x = 115, y = 60, width = 50, height = 50)
btn = tkinter.Button(self.root,text = 'M+',command = self.pressAdd)
btn.place(x = 170, y = 60, width = 50, height = 50)
btn = tkinter.Button(self.root,text = 'M-',command = self.pressSub)
btn.place(x = 225, y = 60, width = 50, height = 50)
#第二行
btn = tkinter.Button(self.root,text = '←',command = self.pressDelete)
btn.place(x = 5, y = 120, width = 50, height = 50)
btn = tkinter.Button(self.root,text = 'CE',command= self.pressCE)
btn.place(x = 60, y = 120, width = 50, height = 50)
btn = tkinter.Button(self.root,text = 'C',command = self.pressClear)
btn.place(x = 115, y = 120, width = 50, height = 50)
btn = tkinter.Button(self.root,text = '±',command= self.pressSign)
btn.place(x = 170, y = 120, width = 50, height = 50)
btn = tkinter.Button(self.root,text = '√',command = self.pressSqrt)
btn.place(x = 225, y = 120, width = 50, height = 50)
#第三行
btn7 = tkinter.Button(self.root,text = 7,command = lambda : self.pressNum('7'))
btn7.place(x = 5, y = 180, width = 50, height = 50)
btn8 = tkinter.Button(self.root,text = 8,command = lambda : self.pressNum('8'))
btn8.place(x = 60, y = 180, width = 50, height = 50)
btn9 = tkinter.Button(self.root,text = 9,command = lambda : self.pressNum('9'))
btn9.place(x = 115, y = 180, width = 50, height = 50)
btn = tkinter.Button(self.root,text = '/',command = lambda :self.pressCompute('/'))
btn.place(x = 170, y = 180, width = 50, height = 50)
btn = tkinter.Button(self.root,text = '%',command =lambda:self.pressCompute('%'))
btn.place(x = 225, y = 180, width = 50, height = 50)
#第四行
btn4 = tkinter.Button(self.root,text = 4,command = lambda : self.pressNum('4'))
btn4.place(x = 5, y = 240, width = 50, height = 50)
btn5 = tkinter.Button(self.root,text = 5,command = lambda : self.pressNum('5'))
btn5.place(x = 60, y = 240, width = 50, height = 50)
btn6 = tkinter.Button(self.root,text = 6,command = lambda : self.pressNum('6'))
btn6.place(x = 115, y = 240, width = 50, height = 50)
btn = tkinter.Button(self.root,text = '*',command = lambda :self.pressCompute('*'))
btn.place(x = 170, y = 240, width = 50, height = 50)
btn = tkinter.Button(self.root,text = '1/x',command = self.pressRec)
btn.place(x = 225, y = 240, width = 50, height = 50)
#第五行
btn1 = tkinter.Button(self.root,text = 1,command = lambda : self.pressNum('1'))
btn1.place(x = 5, y = 300, width = 50, height = 50)
btn2 = tkinter.Button(self.root,text = 2,command = lambda : self.pressNum('2'))
btn2.place(x = 60, y = 300, width = 50, height = 50)
btn3 = tkinter.Button(self.root,text = 3,command = lambda : self.pressNum('3'))
btn3.place(x = 115, y = 300, width = 50, height = 50)
btn = tkinter.Button(self.root,text = '-',command = lambda :self.pressCompute('-'))
btn.place(x = 170, y = 300, width = 50, height = 50)
btn = tkinter.Button(self.root,text = '=',command = self.pressEqual)
btn.place(x = 225, y = 300, width = 50, height = 110)
#第六行
btn0 = tkinter.Button(self.root,text = 0,command = lambda : self.pressNum('0'))
btn0.place(x = 5, y = 360, width = 105, height = 50)
btn = tkinter.Button(self.root,text = '.',command =lambda: self.pressDec('.'))
btn.place(x = 115, y = 360, width = 50, height = 50)
btn = tkinter.Button(self.root,text = '+',command = lambda :self.pressCompute('+'))
btn.place(x = 170, y = 360, width = 50, height = 50)
calculator = jsq()