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 ...
随机推荐
- luoguP1081 开车旅行 题解(NOIP2012)
这道题是真滴火!(一晚上加一节信息课!) 先链接一下题目:luoguP1081 开车旅行 首先,这个预处理就极其变态,要与处理出每一个点往后走A会去哪里,B会去哪里.而且还必须O(nlogn)给它跑出 ...
- CodeChef Sereja and GCD
Sereja and GCD Problem code: SEAGCD Submit All Submissions All submissions for this problem ar ...
- windows不重装系统和重建MBR分区表来扩展系统盘
step1. 下载Acronis Disk Director Suite工具,随便一搜都能下载的到. step2. 这个软件使用非常easy,网上有非常多图文教程.扩充盘使用Increase the ...
- GitHub 风格的 Markdown 语法
GitHub 风格的 Markdown 语法 [译] GitHub 风格的 Markdown 语法 Original: GitHub Flavored Markdown - GitHub Help T ...
- 北京太速科技有限公司 layout 事业部
涵盖领域设计能力 ·通信板卡:PCI/PCIE/CPCI/VPX/光通信/无线通信/射频雷达/显卡 1.最小线宽:2MIL·主板服务器:电脑主板/交换机/服 ...
- 前端每日实战:53# 视频演示如何用纯 CSS 创作一个文本淡入淡出的 loader 动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ERwpeG 可交互视频 此视频是可 ...
- JDBC和驱动类Driver
什么是JDBC? JDBC(Java DataBase Connectivity),是一套面向对象的应用程序接口(API),制定了统一的访问各类关系数据库的标准接口,为各个数据库厂商提供了标准的实现. ...
- 禁止打开 F12 开发者工具
禁止F12 window.onkeydown = window.onkeyup = window.onkeypress = function (event) { // 判断是否按下F12,F12键码为 ...
- React学习笔记-生命周期函数
定义: 生命周期函数指在某一个时刻组件会自动调用执行的函数
- 数据挖掘:周期性分析SMCA算法
数据挖掘:周期性分析SMCA算法 原文地址:http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1423978 算法介绍 以时间顺序挖掘周期性的模式 ...