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

相关内容

热门资讯

少先队建队日主持词 少先队建队日主持词  什么是主持词  由主持人于节目进行过程中串联节目的串联词。如今的各种演出活动和...
幼儿园开园揭牌剪彩仪式主持词 幼儿园开园揭牌剪彩仪式主持词  主持词要把握好吸引观众、导入主题、创设情境等环节以吸引观众。在一步步...
公司辞旧迎新晚会主持词串词   男:尊敬的各位领导、各位来宾,  女:亲爱的同事们  合:大家下午好!  男:光阴似箭,岁月如梭...
纯中式婚礼主持词 纯中式婚礼主持词(通用5篇)  主持词是主持人在台上表演的灵魂之所在。在现在的社会生活中,越来越多的...
悟空传的经典台词 悟空传的经典台词  1、我曾深爱过,我不在乎结局。  2、我知道天会愤怒,那,你知不知道,天也会颤抖...
最有创意的广告词(经典 最有创意的广告词(经典  01 钱不是问题,问题是没钱。  02 钻石恆久远,一颗就破產。  03 ...
毕业感谢致辞 关于毕业感谢致辞(精选15篇)  无论是在学校还是在社会中,大家都写过致辞吧,致辞的措词造句要考虑与...
年会嘉宾简短致辞 年会嘉宾简短致辞  在日复一日的学习、工作或生活中,大家总少不了要接触或使用致辞吧,致辞具有很强的实...
成长礼主持稿 成长礼主持稿(通用8篇)  在日常生活和工作中,需要使用主持稿的情况越来越多,主持稿是在晚会、联欢会...
电视剧《放羊的星星》经典台词 电视剧《放羊的星星》经典台词  在现实社会中,用到台词的地方越来越多,台词是一种特殊的,也是很难掌握...
抓周仪式主持词 抓周仪式主持词范文  主持词是主持人在台上表演的灵魂之所在。在如今这个中国,主持词是活动、集会等的必...
年终总结大会主持词结束语 年终总结大会主持词结束语  主持词是各种演出活动和集会中主持人串联节目的串联词。时代不断在进步,主持...
纯中式婚礼主持词(2) 让我们共同举起手中的酒杯,共同祝福我们这一对知心爱人,祝福他们在爱的旅途上风雨相承,相濡以沫,真爱一...
幼儿园园庆主持词 幼儿园园庆主持词  利用在中国拥有几千年文化的诗词能够有效提高主持词的感染力。在人们积极参与各种活动...
篮球比赛开幕式主持词 篮球比赛开幕式主持词(通用5篇)  主持词可以采用和历史文化有关的表述方法去写作以提升活动的文化内涵...
六一儿童节活动节目的主持词 六一儿童节活动节目的主持词(精选7篇)  主持词是各种演出活动和集会中主持人串联节目的串联词。在当今...
公司员工的感谢词 公司员工的感谢词3篇  我们虽然是公司的一名员工,其实也是公司的主人,需要有将公司当成家的态度,态度...
毕业晚会的主持稿 毕业晚会的主持稿(精选11篇)  在现在社会,我们很多时候都不得不用到主持稿,主持稿是主持人为节目进...
《加油金三顺》经典台词 《加油金三顺》经典台词  1、回忆是没有任何力量的。(三顺)  2、人都知道会死,但不还是活着吗?(...
升学酒会主持词 升学酒会主持词  借鉴诗词和散文诗是主持词的一种写作手法。在如今这个时代,司仪等是很多场合都需要的角...