#计算器
import tkinter
import math
import tkinter.messagebox
class jsq:
#页面布局方法
def __init__(self):
self.root=tkinter.Tk()
self.root.minsize(330,440)
#禁止屏幕变化
self.root.resizable(width=False,height=False)
self.root.title("小熊计算器")
#设置显示面板的变量
self.result=tkinter.StringVar()
self.result.set(0)
#设置一个全局变量 运算数字和符号的列表
self.lists=[]
#添加一个是否被按下运算符的标志位
self.ispresssign=False
#数字是否按下
self.numsign=False
#界面布局
self.layout()
self.myfunc()
self.root.mainloop()
# 定义操作函数
def myfunc(self):
# 创建总菜单
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) Ctel+H", command=self.myfunc)
filemenu.add_command(label="数字分组", command=self.myfunc)
filemenu.add_separator()
filemenu.add_command(label="●基本(B) Ctrl+F4", command=self.myfunc)
filemenu.add_command(label="单位转换(U) Ctel+U", command=self.myfunc)
filemenu.add_command(label="日期计算(D) Ctrl+E", command=self.myfunc)
filemenu.add_command(label="工作表(W)", command=self.myfunc)
allmenu.add_cascade(label="查看(V)", menu=filemenu)
# 添加子菜单
filemenu = tkinter.Menu(allmenu, tearoff=0)
filemenu.add_command(label="复制(C) Ctrl+C", command=self.myfunc)
filemenu.add_command(label="粘帖(P) Ctrl+V", command=self.myfunc)
filemenu.add_separator()
filemenu.add_command(label="历史记录(H)", command=self.myfunc)
allmenu.add_cascade(label="编辑(E)", menu=filemenu)
# 添加子菜单
filemenu = tkinter.Menu(allmenu, tearoff=0)
filemenu.add_command(label="查看帮助(V) F1", command=self.myfunc)
filemenu.add_separator()
filemenu.add_command(label="关于计算器(A)", command=self.myfunc)
allmenu.add_cascade(label="帮助(H)", menu=filemenu)
# 摆放菜单
self.root.config(menu=allmenu)
#界面组件摆放
def layout(self):
#显示面板
show = tkinter.Label(self.root, textvariable=self.result, bg="white", font=("隶书", 28,"bold"), anchor="e",borderwidth=10)
show.place(x=20, y=20, height=50, width=290)
#数字及功能键摆放
btn1 = tkinter.Button(self.root,bd=3, text="MC",command=self.mc)
btn1.place(x=20, y=80, height=50, width=50)
btn1 = tkinter.Button(self.root,bd=3, text="MR",command=self.mr)
btn1.place(x=80, y=80, height=50, width=50)
btn1 = tkinter.Button(self.root,bd=3, text="MS",command=self.ms)
btn1.place(x=140, y=80, height=50, width=50)
btn1 = tkinter.Button(self.root,bd=3, text="M+",command=self.mjia)
btn1.place(x=200, y=80, height=50, width=50)
btn1 = tkinter.Button(self.root,bd=3, text="M-",command=self.mjian)
btn1.place(x=260, y=80, height=50, width=50)
#功能键
btn1 = tkinter.Button(self.root,bd=3, text="←", command=self.delete)
btn1.place(x=20, y=140, height=50, width=50)
btn1 = tkinter.Button(self.root, bd=3,text="CE", command=self.clearce)
btn1.place(x=80, y=140, height=50, width=50)
btn1 = tkinter.Button(self.root, bd=3,text="C", command=self.clear)
btn1.place(x=140, y=140, height=50, width=50)
btn1 = tkinter.Button(self.root,bd=3, text="±", command=self.zhengfu)
btn1.place(x=200, y=140, height=50, width=50)
btn1 = tkinter.Button(self.root,bd=3, text="√", command=self.sqr)
btn1.place(x=260, y=140, height=50, width=50)
# 7~9
btn1 = tkinter.Button(self.root, bd=3,text="7", command=lambda: self.pressnum("7"))
btn1.place(x=20, y=200, height=50, width=50)
btn1 = tkinter.Button(self.root, bd=3,text="8", command=lambda: self.pressnum("8"))
btn1.place(x=80, y=200, height=50, width=50)
btn1 = tkinter.Button(self.root, bd=3,text="9", command=lambda: self.pressnum("9"))
btn1.place(x=140, y=200, height=50, width=50)
btn1 = tkinter.Button(self.root,bd=3, text="/", command=lambda: self.presscompute("/"))
btn1.place(x=200, y=200, height=50, width=50)
btn1 = tkinter.Button(self.root,bd=3, text="%", command=lambda: self.presscompute("%"))
btn1.place(x=260, y=200, height=50, width=50)
# 4~6
btn1 = tkinter.Button(self.root, bd=3,text="4", command=lambda: self.pressnum("4"))
btn1.place(x=20, y=260, height=50, width=50)
btn1 = tkinter.Button(self.root, bd=3,text="5", command=lambda: self.pressnum("5"))
btn1.place(x=80, y=260, height=50, width=50)
btn1 = tkinter.Button(self.root, bd=3,text="6", command=lambda: self.pressnum("6"))
btn1.place(x=140, y=260, height=50, width=50)
btn1 = tkinter.Button(self.root,bd=3, text="*", command=lambda: self.presscompute("*"))
btn1.place(x=200, y=260, height=50, width=50)
btn1 = tkinter.Button(self.root,bd=3, text="1/x", command=self.fenshu)
btn1.place(x=260, y=260, height=50, width=50)
# 1~3
btn1 = tkinter.Button(self.root,bd=3, text="1", command=lambda: self.pressnum("1"))
btn1.place(x=20, y=320, height=50, width=50)
btn1 = tkinter.Button(self.root,bd=3, text="2", command=lambda: self.pressnum("2"))
btn1.place(x=80, y=320, height=50, width=50)
btn1 = tkinter.Button(self.root,bd=3, text="3", command=lambda: self.pressnum("3"))
btn1.place(x=140, y=320, height=50, width=50)
btn1 = tkinter.Button(self.root,bd=3, text="-", command=lambda: self.presscompute("-"))
btn1.place(x=200, y=320, height=50, width=50)
btn1 = tkinter.Button(self.root,bd=3, text="=", command=self.eqal)
btn1.place(x=260, y=320, height=110, width=50)
# 0 . +
btn1 = tkinter.Button(self.root,bd=3, text="0", command=lambda: self.pressnum("0"))
btn1.place(x=20, y=380, height=50, width=110)
btn1 = tkinter.Button(self.root,bd=3, text=".", command=lambda: self.pressnum("."))
btn1.place(x=140, y=380, height=50, width=50)
btn1 = tkinter.Button(self.root,bd=3, text="+", command=lambda: self.presscompute("+"))
btn1.place(x=200, y=380, height=50, width=50)
#数字方法
def pressnum(self,num):
#判断是否按下数字
if self.numsign==True:
self.result.set("0")
self.numsign=False
#判断值是否为0
if self.result.get()=="0":
self.result.set(num)
if num==".": #如果先按下小数点 前面加0
self.result.set("0"+num)
else: #只能有一个小数点
if self.result.get().count(".")==0:
#获取当前的值存入变量
oldnum=self.result.get()
#将变量中的值和后面输入的值拼接
self.result.set(oldnum+num)
elif num !=".":
# 获取当前的值存入变量
oldnum = self.result.get()
# 将变量中的值和后面输入的值拼接
self.result.set(oldnum + num)
self.numsign=False
self.ispresssign=True
#运算函数
def presscompute(self,sign):
if self.ispresssign==True:
self.lists.append(self.result.get())
self.lists.append(sign)
self.ispresssign=False
self.numsign=True
#获取运算结果
def eqal(self):
self.lists.append(self.result.get())
computestr="".join(self.lists)
if "+-*/=" in computestr:
computestr=computestr[0:-1]
#eval
endnum=eval(computestr)
#将运算结果显示在屏幕上
self.result.set(endnum)
#清空列表
self.lists.clear()
#判断数字是否按下
self.numsign=True
if endnum==float(endnum):
self.result.set(round(endnum,3))
#清空操作(C)
def clear(self):
self.lists = []
self.result.set("0")
# 清空操作(CE)
def clearce(self):
self.result.set("0")
# 删除操作
def delete(self):
if self.result.get() == "" or self.result.get == "0":
self.result.set("0")
return
else:
#返回界面字符串长度
changdu = len(self.result.get())
if changdu > 1:
#在屏幕上获取字符串给变量
strnum = self.result.get()
#取片操作
strnum = strnum[0:changdu - 1]
self.result.set(strnum)
else:
self.result.set("0")
#正负数操作
def zhengfu(self):
strnum = self.result.get()
#判断一个数是否有负号
if strnum[0] == "-":
self.result.set(strnum[1:])
elif strnum[0] != "-" and strnum != "0":
self.result.set("-" + strnum)
# 开平方
def sqr(self):
import math
strnum = float(self.result.get())
#开平方操作
endnum = math.sqrt(strnum)
self.result.set(endnum)
# 1/x
def fenshu(self):
if self.result.get()=="0":
self.result.set("2B,除数不能为0")
else:
strnum = float(self.result.get())
endnum = 1 / strnum
self.result.set(endnum)
#MC
def mc(self):
tkinter.messagebox.showinfo(title="MC功能",message="正在努力开发中^_^")
#MR
def mr(self):
tkinter.messagebox.showinfo(title="MR功能", message="正在努力开发中^_^")
#MS
def ms(self):
tkinter.messagebox.showinfo(title="MS功能", message="正在努力开发中^_^")
#M+
def mjia(self):
tkinter.messagebox.showinfo(title="M+功能", message="正在努力开发中^_^")
#M-
def mjian(self):
tkinter.messagebox.showinfo(title="M-功能",message="正在努力开发中^_^")
#实例化对象
ll=jsq()