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 ...
随机推荐
- 洛谷 P3368 【模板】树状数组 2(区间加,单点查询)
题目链接 https://www.luogu.org/problemnew/show/P3368 树状数组 最基础的用法:https://www.cnblogs.com/yinyuqin/p/1096 ...
- python 模块和包深度学习理解
python 模块和包 简单说相当于命名空间 1,python 模块 python模块就是一个文件,里面有函数,变量等 import 模块 模块.方法 from 模块 import fu ...
- python学习第二天标准输入输出和注释用法
任何编程语言都有输入输出和用打交道,python也不例外,输入input(),输出print() 玖乐网络(http://www.96net.com.cn/)分享自己的心得 1,input()用法实例 ...
- elementUI 导航栏点击之后改变背景色,背景色悬停
一开始设置的是: .menuLeft .el-menu-item:hover{ background: #6db6ff !important; } .menuLeft .el-submenu__tit ...
- Leetcode Lect3 二分法总结
二分法模板 非递归版本: public class Solution { /** * @param A an integer array sorted in ascending order * @pa ...
- JS面向对象——工厂模型
工厂模型抽象了创建具体对象的过程,以下示例代码说明工厂类型: <!DOCTYPE html> <html> <head> <title>工厂模型< ...
- 关于javascript中的构造函数和普通函数探索 [转]
这是第一篇关于javascript模块的文章,在javascript入门的目录下,主要是记录一些对网上精彩的js研读碰到的疑惑,并做一些实验和探索 关于js中的对象和方法的定义博主感到非常的迷惑.针对 ...
- neuoj Blurred Pictures(小思维题
https://oj.neu.edu.cn/problem/1505 题意:一张由n*n的照片,每行从第ai个像素点到第bi个像素点是非模糊点,要求找出最大的正方形,该正方形中的像素都是非模糊点. 思 ...
- vue 字符串长度控制显示的字数超出显示省略号
1. html <p class="index__Feature-list-itemlist-title newline"> {{item.name| ellipsis ...
- Struts和Hibernate的jar包
这几天做了一个javaee关于struts框架和Hibernate框架的实践,实践内容倒是没什么,关键是找框架的配置花了许多时间 于是在这里把这两个框架的有关jar上传分享一下 链接: https:/ ...