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()

python 简易计算器的更多相关文章

  1. python 简易计算器(只能计算加减乘除和括号)

    import re # 格式化字符串函数(消除一些错误的格式) def format_string(string): # 一系列的替换语句 string = string.replace(" ...

  2. python简易计算器

    import re """ 过程:(最内部的括号->先乘除,替换->整理表达式->加减)->替换 """ def m ...

  3. Python之实现一个简易计算器

    自己动手写计算器 一.功能分析 用户输入一个类似这样 3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 这样的表达式,假设表达式里 ...

  4. python + PyQt5 实现 简易计算器

    忽然想起之前一直想写个简单的计算器,今天就写了一下,界面有些简陋,但是基本功能实现没有问题 以下是源码: # --*-- coding:utf-8 --*-- import sys from PyQt ...

  5. 自制c#简易计算器

    这是一个课堂作业,我觉得作为一个简易的计算器不需要态度复杂的东西,可能还有一些bug,有空再慢慢加强. using System;using System.Collections.Generic;us ...

  6. 剖析简易计算器带你入门微信小程序开发

    写在前面,但是重点在后面 这是教程,也不是教程. 可以先看Demo的操作动图,看看是个什么玩意儿,GitHub地址(https://github.com/dunizb/wxapp-sCalc) 自从微 ...

  7. PHP学习笔记02——简易计算器

    <!DOCTYPE html> <html> <head> <title>PHP简易计算器</title> </head> &l ...

  8. JavaScript之简易计算器

    <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...

  9. 菜鸟学习Struts——简易计算器

    这是学习Struts的一个简单的例子文件结构如下: 1.配置Struts环境 2.新建input.jsp,success.jsp,error.jsp input.jsp代码如下: <%@ pag ...

随机推荐

  1. Swift编程语言学习1.6——可选值

    可选值 使用可选(optionals)来处理值可能缺失的情况.可选表示: 有值,等于 x   或者没有值 注意: C 和 Objective-C 中并没有可选这个概念.最接近的是 Objective- ...

  2. Windows程序设计--(五)绘图基础

    5.1 GDI的结构 图形设备接口(GDI:Graphics Device Interface)是Windows的子系统,它负责在视讯显示器和打印机上显示图形. 5.2 设备环境 5.2.1 获取设备 ...

  3. matlab调试技巧

    Matlab的调试总体分为,直接调试和间接调试. 1.直接调试: (1)去掉句末的分号: (2)单独调试一个函数:将第一行的函数声明注释掉,并定义输入量,以脚本方式执行 M 文件: (3)适当地方添加 ...

  4. python时间的获取

    一.获取当前时间 import datetime # 2019-7-9 print(datetime.datetime.now().year) # 2019 print(datetime.dateti ...

  5. AES-OZ745 OZ745 Zynq-7000 开发板与套件

    北京太速科技有限公司为广大合作单位特设海外代购业务,主要包括各类板卡.相机.传感器.仪器仪表.专用芯片等.代购业务仅收取基本的手续费. 北京太速科技有限公司在线客服:QQ:448468544 淘宝网站 ...

  6. MySQL--16 MHA修复

    目录 一.恢复MHA 二.MHA切换 三.配置VIP漂移 一.恢复MHA #1.修复旧主库 [root@db01 ~]# /etc/init.d/mysqld start #2.在mha日志中找到ch ...

  7. 描述一下JVM加载class文件的原理机制?

    JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类. 由于Java的跨平台性,经过编 ...

  8. shell脚本检索所有mysql数据库中没有primary key的表

    1.mkdir -p /root/scripts/ 2. cd /root/scripts/ vim query.sql,代码如下: SELECT CONCAT(t.table_schema,&quo ...

  9. Go 迭代切片

    迭代切片有两种方式: 1. 使用 for range 迭代切片   // 其长度和容量都是 4 个元素 slice := [], , , } // 迭代每一个元素,并显示其值 for index, v ...

  10. springboot上传excel到oss

    参考:https://blog.csdn.net/qq_34864038/article/details/80239320 https://blog.csdn.net/qq_27319683/arti ...