admin管理员组文章数量:1794759
Python计算器(包含机制转换)
实现思路:
要优先处理内层括号运算--外层括号运算--先乘除后加减的原则:
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: return clear(entry) # 异常捕获,在进行数据运算时如果出现异常进行相应处理 # noinspection PyBroadException try: # 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()版权声明:本文标题:Python计算器(包含机制转换) 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686579667a84016.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论