python 简易计算器
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 简易计算器的更多相关文章
- python 简易计算器(只能计算加减乘除和括号)
import re # 格式化字符串函数(消除一些错误的格式) def format_string(string): # 一系列的替换语句 string = string.replace(" ...
- python简易计算器
import re """ 过程:(最内部的括号->先乘除,替换->整理表达式->加减)->替换 """ def m ...
- Python之实现一个简易计算器
自己动手写计算器 一.功能分析 用户输入一个类似这样 3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 这样的表达式,假设表达式里 ...
- python + PyQt5 实现 简易计算器
忽然想起之前一直想写个简单的计算器,今天就写了一下,界面有些简陋,但是基本功能实现没有问题 以下是源码: # --*-- coding:utf-8 --*-- import sys from PyQt ...
- 自制c#简易计算器
这是一个课堂作业,我觉得作为一个简易的计算器不需要态度复杂的东西,可能还有一些bug,有空再慢慢加强. using System;using System.Collections.Generic;us ...
- 剖析简易计算器带你入门微信小程序开发
写在前面,但是重点在后面 这是教程,也不是教程. 可以先看Demo的操作动图,看看是个什么玩意儿,GitHub地址(https://github.com/dunizb/wxapp-sCalc) 自从微 ...
- PHP学习笔记02——简易计算器
<!DOCTYPE html> <html> <head> <title>PHP简易计算器</title> </head> &l ...
- JavaScript之简易计算器
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...
- 菜鸟学习Struts——简易计算器
这是学习Struts的一个简单的例子文件结构如下: 1.配置Struts环境 2.新建input.jsp,success.jsp,error.jsp input.jsp代码如下: <%@ pag ...
随机推荐
- Day9---Python的集合类
集合类 1.生成办法: 可使用{.....} 或者set()生成集合,例如 a = {23,214,34,324,234,34} #这里的集合就是数学上的集合a = set('dsfasfsdf') ...
- P4843 清理雪道(上下界网络流)
P4843 清理雪道 上下界最小流 我们先搞一遍上下界可行流(转) 回忆上下界最大流的写法:在可行流的残量网络$s\ -\ t$上跑最大流,答案为可行流$+$残量网络的最大流 那么上下界最小流的写法呢 ...
- 我心中的ASP.NET Core 新核心对象WebHost(二)
这是ASP.NET Core新核心对象系列的第二篇,上一篇 WebHost准备阶段 我们讲到了WebHostBuilder的初始化及配置.我们给WebHostBuilder进行以下配置 UseKest ...
- SpringCloud Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded
出现此问题,有可能是spring cloud 与spring boot 版本不匹配引发的问题,此次用的版本是:Finchley.RC1 经过一番关键字查找,发现spring cloud 与spring ...
- 2018-8-10-win10-uwp-毛玻璃
title author date CreateTime categories win10 uwp 毛玻璃 lindexi 2018-08-10 19:16:50 +0800 2018-2-13 17 ...
- MySQL语句优化方法(简单版)
基础回顾: sql语句是怎么样运行的? 一般来说,客户端发送sql语句到数据库服务器——数据库服务器进行运算并返回结果——客户端显示sql语句运行结果. 在本地运行时以workbench为例,客户端为 ...
- 121-基于TI DSP TMS320DM8148的全高清1080P 60fs的视频编解码系统 机器人主板
基于TI DSP TMS320DM8148的全高清1080P 60fs的视频编解码系统 一.板卡概述 本系统基于最先进的DSP技术,构建一个全高清的视频编解码系统,采用TI的芯片.借助TI的DaVin ...
- Vue 列表渲染中的key
首先看一下官网的论述: 当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略.如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序, 而是简单 ...
- python搭建服务,传输文件
一.进入需要共享的文件目录 #cd /home #python -m SimpleHTTPServer 二.浏览器访问资源 再浏览器地址栏输入: 服务器IP:8000 如图:
- MySQL查询执行路径
1.客户端发送一条查询给服务器2.服务器先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果.3.服务器端进行SQL解析.预处理,再由优化器生成对应的执行计划.4.MySQL根据优化器生成的执行 ...