树的应用:计算器
要求:计算器需要实现所有单击版计算器所具有的功能,并要用到树结构。
import re
from tkinter import *
from lark import Lark
grammar = """
?start: sum
?sum: product
| sum "+" product -> add
| sum "-" product -> sub
?product: atom
| product "*" atom -> mul
| product "÷" atom -> div
?atom: NUMBER -> number
| "-" atom -> neg
| "(" sum ")"
| atom "%" -> percentage
%import common.CNAME
%import common.NUMBER
%import common.WS
%ignore WS
"""
class Calculator:
def __init__(self, master):
self.master = master
master.title("Calculator")
self.parser = Lark(grammar, start='start')
self.display = Entry(master, width=25, font=('Arial', 16))
self.display.grid(row=0, column=0, columnspan=4, padx=5, pady=5)
self.display_result = Entry(master, width=25, font=('Arial', 16))
self.display_result.grid(row=1, column=0, columnspan=4, padx=5, pady=5)
buttons = [['C', '↼', '^', '÷'],
['7', '8', '9', '*'],
['4', '5', '6', '-'],
['1', '2', '3', '+'],
['%', '0', '.', '='], ]
for i in range(len(buttons)):
for j in range(len(buttons[i])):
self.create_button(buttons[i][j], i + 2, j)
def create_button(self, text, row, column):
button = Button(self.master, text=text, width=5, height=2, font=('Arial', 16),
command=lambda: self.click(text))
button.grid(row=row, column=column, padx=5, pady=5)
def click(self, key):
if key == '=':
try:
expression = self.display.get()
if re.search(r'\^', expression):
result = eval(expression)
else:
tree = self.parser.parse(expression)
result = self.evaluate(tree)
self.display_result.delete(0, END)
self.display_result.insert(END, result)
except:
self.display_result.delete(0, END)
self.display_result.insert(END, 'Error')
elif key == 'C':
self.display.delete(0, END)
self.display_result.delete(0, END)
elif key == '↼':
last_index = self.display.index(END) - 1
self.display.delete(last_index)
else:
self.display.insert(END, key)
def evaluate(self, tree):
if tree.data == 'number':
return float(tree.children[0])
elif tree.data == 'add':
return self.evaluate(tree.children[0]) + self.evaluate(tree.children[1])
elif tree.data == 'sub':
return self.evaluate(tree.children[0]) - self.evaluate(tree.children[1])
elif tree.data == 'mul':
return self.evaluate(tree.children[0]) * self.evaluate(tree.children[1])
elif tree.data == 'div':
return self.evaluate(tree.children[0]) / self.evaluate(tree.children[1])
elif tree.data == 'neg':
return -self.evaluate(tree.children[0])
elif tree.data == 'percentage':
return self.evaluate(tree.children[0]) / 100.0
root = Tk()
calculator = Calculator(root)
root.mainloop()
上述代码是一个简单的计算器应用程序。它使用了Python的Tkinter库来创建一个图形用户界面(GUI),并实现了基本的计算功能。
代码定义了一个Calculator类,它包含了一个窗口(由Tkinter的Tk类创建),一个文本框用于显示输入和输出,以及一组按钮用于输入操作符和数字。
计算器支持基本的四则运算(加法、减法、乘法和除法),同时还支持百分比计算。计算器通过解析用户输入的表达式,使用Lark库构建语法树,并通过递归地评估语法树来计算结果。
用户可以通过点击按钮来输入表达式和操作符,并通过点击"=“按钮来获取计算结果。如果输入的表达式不符合语法规则或者计算过程中出现错误,计算器会显示"Error”。
用户还可以通过点击"C"按钮清除输入和输出,以及通过点击"↼"按钮删除最后一个字符。
总之,这段代码实现了一个简单的图形界面计算器,可以执行基本的四则运算和百分比计算。