import tkinter
import tkinter.messagebox
import math
'''
波波版计算器可实现的功能
1.能进行简单的加减惩处
2.能进行开根号操作
3.能进行后退操作,但不完美
4.能进行清空操作
5.可以连续开根号
解决的bug
5.连续错按运算符号之后按最后一个运算符运算
6.连续按等于号可以连乘3×3=9 再按等号9再一次×3
7.不能连续按点号,否则无效
8.除数不能为0
9.连续按正负号,面板中的数字变号
注意:
10.显示面板只能显示16个符号
bug 很多,请不要联系我
微信号:zb983978082
'''
class jsq:
'''
方法
运算(=)
按数字
按运算符
界面布局
'''
#界面布局方法
def __init__(self):
#创建主界面 并保存到对象成员属性中
self.root = tkinter.Tk()
self.root.minsize(300, 380)
self.root.title('波波版计算器')
#设置显示面板的变量
self.result = tkinter.StringVar()
self.result.set(0)
# 设置一个全局变量 运算数字和符号的列表 列表可以穿透函数 不需要全局变量声明global
self.lists = []
# 添加一个用于判断是否按下运算符号的标志
self.isPressSign = False
#添加一个用于判断是否按下等于符号的标志
self.isPressEqual = False
#添加一个用于判断是否按下了小数点的标志
self.isPressDot = False
#添加一个用于判断是否按下正负号的标志
self.ispressFuHao = False
#添加一个用于判断上一次是否按下除号的标志
self.isPressChu = False
#界面布局
self.layout()
self.root.mainloop()
#界面组件摆放
def layout(self):
#显示面板
#========================================== 菜单 ===================================================
#添加总菜单
allmenu = tkinter.Menu(self.root)
#添加子菜单
helpmenu = tkinter.Menu(allmenu,tearoff = 0)
allmenu.add_cascade(label = '帮助H',menu = helpmenu)
#添加选项卡
helpmenu.add_command(label = '查看帮助',command = self.pressHelp)
#摆放菜单
self.root.config(menu = allmenu )
#标签
label = tkinter.Label(self.root, textvariable=self.result, bg='white', font=('黑体', 20), anchor='e')
label.place(x=20, y=20, width=260)
# ===================================数字=============================================================
btn1 = tkinter.Button(self.root, text='1', command=lambda: self.pressNum('1'))
btn1.place(x=20, y=140, width=50, height=40)
btn2 = tkinter.Button(self.root, text='2', command=lambda: self.pressNum('2'))
btn2.place(x=90, y=140, width=50, height=40)
btn3 = tkinter.Button(self.root, text='3', command=lambda: self.pressNum('3'))
btn3.place(x=160, y=140, width=50, height=40)
btn4 = tkinter.Button(self.root, text='4', command=lambda: self.pressNum('4'))
btn4.place(x=20, y=200, width=50, height=40)
btn5 = tkinter.Button(self.root, text='5', command=lambda: self.pressNum('5'))
btn5.place(x=90, y=200, width=50, height=40)
btn6 = tkinter.Button(self.root, text='6', command=lambda: self.pressNum('6'))
btn6.place(x=160, y=200, width=50, height=40)
btn7 = tkinter.Button(self.root, text='7', command=lambda: self.pressNum('7'))
btn7.place(x=20, y=260, width=50, height=40)
btn8 = tkinter.Button(self.root, text='8', command=lambda: self.pressNum('8'))
btn8.place(x=90, y=260, width=50, height=40)
btn9 = tkinter.Button(self.root, text='9', command=lambda: self.pressNum('9'))
btn9.place(x=160, y=260, width=50, height=40)
btn0 = tkinter.Button(self.root, text='0', command=lambda: self.pressNum('0'))
btn0.place(x=20, y=320, width=50, height=40)
# =================================== 运算符号 ===========================================================
#加号
btnjia = tkinter.Button(self.root, text='+', command=lambda: self.pressOperation('+'))
btnjia.place(x=230, y=80, width=50, height=40)
#减号
btnjian = tkinter.Button(self.root, text='-', command=lambda: self.pressOperation('-'))
btnjian.place(x=230, y=140, width=50, height=40)
#乘法
btncheng = tkinter.Button(self.root, text='×', command=lambda: self.pressOperation('*'))
btncheng.place(x=230, y=200, width=50, height=40)
#除法
btnchu = tkinter.Button(self.root, text='/', command=lambda: self.pressOperation('/'))
btnchu.place(x=230, y=260, width=50, height=40)
#等号
btneq = tkinter.Button(self.root, text='=', command=lambda: self.pressEqual())
btneq.place(x=230, y=320, width=50, height=40)
# ========================================== 其他符号 ========================================
#后退
btnback = tkinter.Button(self.root, text='←', command=lambda: self.pressBack())
btnback.place(x=20, y=80, width=50, height=40)
#开根号
btngenhao = tkinter.Button(self.root, text='√',command = lambda: self.presssqrt())
btngenhao.place(x=90, y=80, width=50, height=40)
#清空符号
btnclear = tkinter.Button(self.root, text='C', command=lambda: self.pressClear())
btnclear.place(x=160, y=80, width=50, height=40)
#正负号
btn10 = tkinter.Button(self.root, text='±', command=lambda: self.pressFuHao('-1'))
btn10.place(x=90, y=320, width=50, height=40)
#小数点
btndot = tkinter.Button(self.root, text='.', command=lambda: self.pressDot('.'))
btndot.place(x=160, y=320, width=50, height=40)
#数字方法
def pressNum(self,num):
if self.isPressChu == True and num == '0':
tkinter.messagebox.showerror('错误','除数不能为0')
else:
# 判断是否按下了运算符号
if self.isPressSign == False:
pass
else:
self.result.set(0)
# 重置运算符号的状态
self.isPressSign = False
if self.isPressEqual == False:
pass
else:
self.result.set(0)
self.isPressEqual = False
# 获取面板中的原有数字
oldnum = self.result.get()
#self.result.get()
# 判断界面数字是否为0
if oldnum == '0':
self.result.set(num)
else:
#连接上新按下的数字 num 和oldnum都是字符串
newnum = oldnum + num
#将按下的数字写到面板中
self.result.set(newnum)
#运算函数
def pressOperation(self,sign):
if sign == '/':
self.isPressChu = True
# 保存已经按下的数字和运算符号
#判断上一次操作按下的是否是运算符
if self.isPressSign == True:
#默认删除最后一个元素 这一步操作作用是在用户多次选取运算符只取最后一个运算符
self.lists.pop()
else:
# 获取界面数字
num = self.result.get()
#获取之后的界面数字保存到列表里面
self.lists.append(num)
#print(self.lists)
# 保存按下的操作符号
self.lists.append(sign)
print(self.lists)
#i = self.lists[0]
#j = self.lists[-1]
#self.newlists.append(i)
#self.newlists.append(j)
#print(self.lists)
# 设置运算符为按下状态
self.isPressSign = True
# 获取运算结果
def pressEqual(self):
try:
if self.isPressEqual == True:
curnum2 = self.result.get()
self.lists.append(curnum2)
for k in self.lists2:
self.lists.append(k)
# 将列表转化为字符串
strvar = ''.join(self.lists)
# 使用eval执行字符串中的运算即可
endNum = eval(strvar)
# 将运算结果显示在界面中
self.result.set(endNum)
else:
# 获取所有列表中的内容 (之前的数字和操作)
curnum = self.result.get()
# 将当前界面的数字存入列表
self.lists.append(curnum)
#self.newlists = list(self.lists[0]+self.lists[-2:])
print(self.lists)
self.lists2 = self.lists[-2:]
# 将列表转化为字符串
strvar = ''.join(self.lists)
# 使用eval执行字符串中的运算即可
endNum = eval(strvar)
# 将运算结果显示在界面中
self.result.set(endNum)
self.isPressEqual = True
# 清空运算列表
self.lists.clear()
except:
tkinter.messagebox.showerror('错误', '程序出现错误')
#清空操作
def pressClear(self):
#把界设置为0
self.result.set(0)
#清空列表
self.lists.clear()
# 后退操作
def pressBack(self):
# 获取面板中的数值字符串
if self.isPressEqual == True:
pass
else:
strvar2 = self.result.get()
strvar3 = strvar2[:-1]
if len(strvar3) == 0:
self.result.set(0)
else:
self.result.set(strvar3)
def pressDot(self,dot):
if self.isPressDot == True:
pass
else:
# 获取面板中的原有数字
oldnum = self.result.get()
# 连接上新按下的数字 dot 和 oldnum都是字符串
newnum = oldnum + dot
# 将按下的数字写到面板中
self.result.set(newnum)
self.isPressDot = True
def pressFuHao(self,fuhao):
try:
if self.result.get() == '':
pass
else:
# 获取面板中的原有数字
oldnum = self.result.get()
# 连接上新按下的数字 dot 和 oldnum都是字符串
newnum = float(fuhao) * float(oldnum)
print(newnum,type(newnum))
# 将按下的数字写到面板中
self.result.set(str(newnum))
except:
tkinter.messagebox.showerror('错误', '程序出现错误')
def presssqrt(self):
try:
strvar3 = self.result.get()
floatvar1 = float(strvar3)
if floatvar1 < 0:
tkinter.messagebox.showwarning('警告','负数不能开根号')
else:
self.result.set(math.sqrt(floatvar1))
except:
tkinter.messagebox.showerror('错误', '程序出现错误')
def pressHelp(self):
self.val1 = tkinter.StringVar()
newwindows = tkinter.Toplevel(bg='white')
newwindows.title('计算器说明.txt')
newwindows.minsize(350, 450)
# 打开文件
zp = open('./计算器说明.txt', 'r')
self.shuoming = zp.read()
print(self.shuoming, type(self.shuoming))
self.val1.set(self.shuoming)
label = tkinter.Label(newwindows, bg='white', textvariable=self.val1, font=('黑体', 10), anchor='nw',justify='left')
label.place(x=10, y=10)
#实例化对象
myjsq = jsq()