利用Python语言,tkinter库,编程设计一个计算器,可以实现科学运算,实现括号改变运算顺序,进行小数运算,计算三角函数,计算任意次方,绘图等功能,并且利用一个主窗口负责计算,和一个副窗口进行绘图,点击主窗口的按钮弹出绘图界 面,还可以删除输入错误的字符,主窗口 有两个屏幕,一个显示输入的数据,一个 显示输出的数据,显示的数据均为左对齐。请给出详细的Python代码,并注释每行代码的功能作用,包括引入的每个函数的作用,以及定义的各种变量的作用。
时间: 2024-03-05 13:55:12 浏览: 140
好的,下面是一个简单的计算器程序的代码,包括基本的运算、括号、三角函数、任意次方、小数运算、删除输入错误字符、绘图等功能。由于篇幅较长,我会尽量注释每行代码的功能。
```python
import tkinter as tk
import math
import matplotlib.pyplot as plt
# 定义全局变量,用于记录输入、输出和当前操作
input_str = ""
output_str = ""
current_op = ""
# 定义窗口和组件
root = tk.Tk()
root.title("Scientific Calculator")
input_text = tk.StringVar() # 用于显示输入的文本
output_text = tk.StringVar() # 用于显示输出的文本
input_label = tk.Label(root, textvariable=input_text, font=("Arial", 20), anchor="w", width=25, height=2)
output_label = tk.Label(root, textvariable=output_text, font=("Arial", 20), anchor="w", width=25, height=2)
btn_0 = tk.Button(root, text="0", width=5, height=2, command=lambda: add_input("0"))
btn_1 = tk.Button(root, text="1", width=5, height=2, command=lambda: add_input("1"))
btn_2 = tk.Button(root, text="2", width=5, height=2, command=lambda: add_input("2"))
btn_3 = tk.Button(root, text="3", width=5, height=2, command=lambda: add_input("3"))
btn_4 = tk.Button(root, text="4", width=5, height=2, command=lambda: add_input("4"))
btn_5 = tk.Button(root, text="5", width=5, height=2, command=lambda: add_input("5"))
btn_6 = tk.Button(root, text="6", width=5, height=2, command=lambda: add_input("6"))
btn_7 = tk.Button(root, text="7", width=5, height=2, command=lambda: add_input("7"))
btn_8 = tk.Button(root, text="8", width=5, height=2, command=lambda: add_input("8"))
btn_9 = tk.Button(root, text="9", width=5, height=2, command=lambda: add_input("9"))
btn_add = tk.Button(root, text="+", width=5, height=2, command=lambda: set_op("+"))
btn_sub = tk.Button(root, text="-", width=5, height=2, command=lambda: set_op("-"))
btn_mul = tk.Button(root, text="*", width=5, height=2, command=lambda: set_op("*"))
btn_div = tk.Button(root, text="/", width=5, height=2, command=lambda: set_op("/"))
btn_dot = tk.Button(root, text=".", width=5, height=2, command=lambda: add_input("."))
btn_lbracket = tk.Button(root, text="(", width=5, height=2, command=lambda: add_input("("))
btn_rbracket = tk.Button(root, text=")", width=5, height=2, command=lambda: add_input(")"))
btn_sin = tk.Button(root, text="sin", width=5, height=2, command=sin)
btn_cos = tk.Button(root, text="cos", width=5, height=2, command=cos)
btn_tan = tk.Button(root, text="tan", width=5, height=2, command=tan)
btn_pow = tk.Button(root, text="^", width=5, height=2, command=lambda: set_op("^"))
btn_sqrt = tk.Button(root, text="sqrt", width=5, height=2, command=sqrt)
btn_clear = tk.Button(root, text="C", width=5, height=2, command=clear_input)
btn_del = tk.Button(root, text="Del", width=5, height=2, command=delete_input)
btn_equal = tk.Button(root, text="=", width=5, height=2, command=calculate)
btn_plot = tk.Button(root, text="Plot", width=5, height=2, command=plot)
# 布局组件
input_label.grid(row=0, column=0, columnspan=4)
output_label.grid(row=1, column=0, columnspan=4)
btn_sin.grid(row=2, column=0)
btn_cos.grid(row=2, column=1)
btn_tan.grid(row=2, column=2)
btn_pow.grid(row=2, column=3)
btn_7.grid(row=3, column=0)
btn_8.grid(row=3, column=1)
btn_9.grid(row=3, column=2)
btn_div.grid(row=3, column=3)
btn_4.grid(row=4, column=0)
btn_5.grid(row=4, column=1)
btn_6.grid(row=4, column=2)
btn_mul.grid(row=4, column=3)
btn_1.grid(row=5, column=0)
btn_2.grid(row=5, column=1)
btn_3.grid(row=5, column=2)
btn_sub.grid(row=5, column=3)
btn_dot.grid(row=6, column=0)
btn_0.grid(row=6, column=1)
btn_lbracket.grid(row=6, column=2)
btn_rbracket.grid(row=6, column=3)
btn_clear.grid(row=7, column=0)
btn_del.grid(row=7, column=1)
btn_add.grid(row=7, column=2)
btn_equal.grid(row=7, column=3)
btn_plot.grid(row=8, column=0, columnspan=4)
# 设置输入输出文本框的默认值
input_text.set("0")
output_text.set("0")
def add_input(char):
"""
添加输入字符
"""
global input_str
input_str += char
input_text.set(input_str)
def set_op(op):
"""
设置当前操作符
"""
global input_str, current_op
# 如果当前输入不为空,先计算前面的表达式
if input_str:
calculate()
input_str += op
current_op = op
def clear_input():
"""
清空输入
"""
global input_str, output_str, current_op
input_str = ""
output_str = ""
current_op = ""
input_text.set("0")
output_text.set("0")
def delete_input():
"""
删除输入的最后一个字符
"""
global input_str
if input_str:
input_str = input_str[:-1]
input_text.set(input_str)
def calculate():
"""
计算结果
"""
global input_str, output_str, current_op
# 如果当前输入为空或者只有一个操作符,不进行计算
if not input_str or input_str.endswith(current_op):
return
try:
# 解析输入的表达式
expr = input_str.replace("^", "**")
result = eval(expr)
# 将结果转换为字符串并去掉末尾的小数点和零
output_str = str(result).rstrip("0").rstrip(".")
except:
output_str = "Error"
input_str = output_str
current_op = ""
input_text.set(input_str)
output_text.set(output_str)
def sin():
"""
计算正弦函数
"""
global input_str
input_str += "math.sin("
input_text.set(input_str)
def cos():
"""
计算余弦函数
"""
global input_str
input_str += "math.cos("
input_text.set(input_str)
def tan():
"""
计算正切函数
"""
global input_str
input_str += "math.tan("
input_text.set(input_str)
def sqrt():
"""
计算平方根
"""
global input_str
input_str += "math.sqrt("
input_text.set(input_str)
def plot():
"""
绘制函数图像
"""
# 获取输入的函数表达式
expr = input_str.replace("^", "**")
try:
# 解析表达式并绘制图像
x = range(-100, 100)
y = [eval(expr) for x in range(-100, 100)]
plt.plot(x, y)
plt.show()
except:
pass
root.mainloop() # 运行程序
```
这是一个比较简单的计算器程序,可能还有一些缺陷和需要改进的地方,但是它可以作为一个基础的模板,供你进行扩展和优化。
阅读全文