Python计算器(包含机制转换)
创始人
2024-03-13 07:51:21
0

实现思路:

要优先处理内层括号运算--外层括号运算--先乘除后加减的原则:

1、正则处理用户输入的字符串,然后对其进行判断,判断计算公式是否有括号,有就先将计算公式进行正则处理,先获取最里层的每一个数据,然后一一计算
所要用到的正则是:
inner = re.search(“[()]∗[()]∗”, calc_input)

2、把有括号的计算公式计算出来的结果替换原来初始公式的位置,计算之前分别对重复运算符进行处理

需要处理的重复运算的函数是
def del_double(str):
str = str.replace(“++”, “+”)
str = str.replace(“–”, “-”)
str = str.replace(“±”,“-”)
str = str.replace(“- -”,“-”)
str = str.replace(“+ +”,“+”)
return str

3、然后依次从里到外去除括号并进行计算,和位置替换
calc_input = calc_input.replace(inner.group(), str(ret))
将计算出来的结果分别替换原计算公式

4、最后得出没有括号的公式,合并调用计算控制函数进行计算,中间需要注意的就是 负号 和数字与*在一起的处理,其它还算可以。

5、关于新增进制转换功能,可以基于python内置函数hex、oct、bin进行实现,具体可以将按钮设置为函数名字,将按钮名字作为函数进行计算。

测试

在这里插入图片描述
在这里插入图片描述

测试进制转换

十六进制
在这里插入图片描述

八进制
在这里插入图片描述

二进制

在这里插入图片描述

代码

#  *_* coding:utf8 *_*
import tkinter
from functools import partial# 按钮输入调用
def get_input(entry, argu):# 从entry窗口展示中获取输入的内容input_data = entry.get()# 合法运算符 : + - * / -- ** // +-# ------------ 输入合法性判断的优化 ------------# 最后一个字符不是纯数字(已经有算数符号),原窗口值不为空,且输入值为运算符# if not input_data[-1:].isdecimal() and (not argu.isdecimal()):#     if input_data[-2:] in ["--", "**", "//", "+-"]:#         return#     if (input_data[-1:] + argu) not in ["--", "**", "//", "+-"]:#         return# ------------------------------------------------# 出现连续+,则第二个+为无效输入,不做任何处理if (input_data[-1:] == '+') and (argu == '+'):return# 出现连续+--,则第三个-为无效输入,不做任何处理if (input_data[-2:] == '+-') and (argu == '-'):return# 窗口已经有--后面字符不能为+或-if (input_data[-2:] == '--') and (argu in ['-', '+']):return# 窗口已经有 ** 后面字符不能为 * 或 /if (input_data[-2:] == '**') and (argu in ['*', '/']):return# 输入合法将字符插入到entry窗口结尾entry.insert("end", argu)# 退格(撤销输入)
def backspace(entry):input_len = len(entry.get())# 删除entry窗口中最后的字符entry.delete(input_len - 1)# 清空entry内容(清空窗口)
def clear(entry):entry.delete(0, "end")# 计算
def calc(entry):input_data = entry.get()# 计算前判断输入内容是否为空;首字符不能为*/;*/不能连续出现3次;if not input_data:returnclear(entry)# 异常捕获,在进行数据运算时如果出现异常进行相应处理# noinspection PyBroadExceptiontry:# eval() 函数用来执行一个字符串表达式,并返回表达式的值;并将执行结果转换为字符串output_data = str(eval(input_data))except Exception:# 将提示信息输出到窗口entry.insert("end", "Calculation error")else:# 将计算结果显示在窗口中if len(output_data) > 20:entry.insert("end", "Value overflow")else:entry.insert("end", output_data)if __name__ == '__main__':root = tkinter.Tk()root.title("计算器")# 框体大小可调性,分别表示x,y方向的可变性;root.resizable(0, 0)button_bg = '#fdfdfd'math_sign_bg = '#59a869'cal_output_bg = '#550200'button_active_bg = 'gray'# justify:显示多行文本的时候, 设置不同行之间的对齐方式,可选项包括LEFT, RIGHT, CENTER# 文本从窗口左方开始显示,默认可以显示20个字符# row:entry组件在网格中的横向位置# column:entry组件在网格中的纵向位置# columnspan:正常情况下,一个插件只占一个单元;可通过columnspan来合并一行中的多个相邻单元entry = tkinter.Entry(root, justify="right", font=1)entry.grid(row=0, column=0, columnspan=4, padx=10, pady=10)def place_button(text, func, func_params, bg=button_bg, **place_params):# 偏函数partial,可以理解为定义了一个模板,后续的按钮在模板基础上进行修改或添加特性# activebackground:按钮按下后显示颜place_params色my_button = partial(tkinter.Button, root, bg=button_bg, padx=10, pady=3, activebackground=button_active_bg)button = my_button(text=text, bg=bg, command=lambda: func(*func_params))button.grid(**place_params)# 文本输入类按钮place_button('7', get_input, (entry, '7'), row=1, column=0, ipadx=5, pady=5)place_button('8', get_input, (entry, '8'), row=1, column=1, ipadx=5, pady=5)place_button('9', get_input, (entry, '9'), row=1, column=2, ipadx=5, pady=5)place_button('4', get_input, (entry, '4'), row=2, column=0, ipadx=5, pady=5)place_button('5', get_input, (entry, '5'), row=2, column=1, ipadx=5, pady=5)place_button('6', get_input, (entry, '6'), row=2, column=2, ipadx=5, pady=5)place_button('1', get_input, (entry, '1'), row=3, column=0, ipadx=5, pady=5)place_button('2', get_input, (entry, '2'), row=3, column=1, ipadx=5, pady=5)place_button('3', get_input, (entry, '3'), row=3, column=2, ipadx=5, pady=5)place_button('0', get_input, (entry, '0'), row=4, column=0, padx=8, pady=5,columnspan=2, sticky=tkinter.E + tkinter.W + tkinter.N + tkinter.S)place_button('.', get_input, (entry, '.'), row=4, column=2, ipadx=7, padx=5, pady=5)# 运算输入类按钮(只是背景色不同)# 字符大小('+','-'宽度不一样,使用ipadx进行修正)place_button('+', get_input, (entry, '+'), bg=math_sign_bg, row=1, column=3, ipadx=5, pady=5)place_button('-', get_input, (entry, '-'), bg=math_sign_bg, row=2, column=3, ipadx=5, pady=5)place_button('*', get_input, (entry, '*'), bg=math_sign_bg, row=3, column=3, ipadx=5, pady=5)place_button('/', get_input, (entry, '/'), bg=math_sign_bg, row=4, column=3, ipadx=5, pady=5)place_button('% ', get_input, (entry, '%'), bg=math_sign_bg, row=2, column=5, ipadx=5, pady=5)place_button('hex', get_input, (entry, 'hex'), bg=math_sign_bg, row=2, column=4, ipadx=5, pady=5)place_button('oct', get_input, (entry, 'oct'), bg=math_sign_bg, row=3, column=4, ipadx=5, pady=5)place_button('bin', get_input, (entry, 'bin'), bg=math_sign_bg, row=4, column=4, ipadx=5, pady=5)place_button('(', get_input, (entry, '('), bg=math_sign_bg, row=1, column=4, ipadx=5, pady=5)place_button(')', get_input, (entry, ')'), bg=math_sign_bg, row=1, column=5, ipadx=5, pady=5)place_button('tan', get_input, (entry, 'tan'), bg=math_sign_bg, row=3, column=5, ipadx=5, pady=5)place_button('sin', get_input, (entry, 'sin'), bg=math_sign_bg, row=4, column=5, ipadx=5, pady=5)# 功能输入类按钮(背景色、触发功能不同)place_button('<-', backspace, (entry,), row=5, column=0, ipadx=5, padx=5, pady=5)place_button('C', clear, (entry,), row=5, column=1, pady=5, ipadx=5)place_button('=========', calc, (entry,), bg=cal_output_bg, row=5, column=2, ipadx=5, padx=5, pady=5,columnspan=5, sticky=tkinter.E + tkinter.W + tkinter.N + tkinter.S)root.mainloop()

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...