之前做的那个计算器不好看,功能较单一,而且用到的PySimpleGUI库似乎开始收费了,就重新写了计算器,用的时开源且自带的tkinter,就是代码比之前烦琐了。
普通计算也没啥可说的,讲下弧度转换和三角函数计算:
- 点击“弧度/°”按钮能够实现度和弧度转换;
- 三角函数计算正常情况下用于计算的数字都是弧度,想要实现度的计算就需要在已经存在弧度情况下,点击“弧度/°”按钮。例如要计算sin30与sin30°,分别是:输入30,点击sin得到结果;输入任意数字,点击“弧度/°”,将显示屏除“°”外其他数字利用鼠标更换为30,点击sin得到结果。
# -*- coding: utf-8 -*-
"""
作者:崇山主人
版本:1.1.0
日期:2024-06-08
这是一个用Python编写的科学计算器软件。
以下程序创建了一个简单的科学计算器界面,实现基本的计算功能、清除功能以及三角函数、反三角函数计算功能、弧度转换功能。
使用了 tkinter 和 math 库。
"""
import tkinter as tk
import math
# 创建按钮的函数
def create_button(text, row, col, width, command, bg='lightgray', fg='black'):
button = tk.Button(root, text=text, width=width, font=("Arial", 18), command=command, bg=bg, fg=fg)
button.grid(row=row, column=col, padx=5, pady=5, sticky='nsew')
return button
# 数字按钮的点击事件
def on_number_click(value):
if display_var.get() == "错误":
display_var.set(value)
else:
display_var.set(display_var.get() + value)
# 运算符按钮的点击事件
def on_operator_click(operator):
if display_var.get() != "错误":
display_var.set(display_var.get() + operator)
# 清除按钮的点击事件
def on_clear_click():
display_var.set("")
# 清除一个字符按钮的点击事件
def on_delete_click():
current_value = display_var.get()
if current_value != "错误":
display_var.set(current_value[:-1])
# 计算结果
def calculate_result():
try:
result = str(eval(display_var.get()))
display_var.set(result)
except Exception as e:
display_var.set("错误")
# 计算三角函数
def calculate_trig(trig_func, is_degree):
try:
value = float(display_var.get().replace("°", ""))
if is_degree:
value = math.radians(value)
if trig_func == 'sin':
result = math.sin(value)
elif trig_func == 'cos':
result = math.cos(value)
elif trig_func == 'tan':
result = math.tan(value)
display_var.set(str(round(result, 6)))
except Exception as e:
display_var.set("错误")
# 计算反三角函数
def calculate_inverse_trig(trig_func, is_degree):
try:
value = float(display_var.get().replace("°", ""))
if trig_func == 'asin':
result = math.degrees(math.asin(value)) if is_degree else math.asin(value)
elif trig_func == 'acos':
result = math.degrees(math.acos(value)) if is_degree else math.acos(value)
elif trig_func == 'atan':
result = math.degrees(math.atan(value)) if is_degree else math.atan(value)
display_var.set(str(round(result, 6)))
except Exception as e:
display_var.set("错误")
# 改变角度显示模式(度/弧度)
def change_angle_mode():
if display_var.get() and display_var.get() != "错误": # 检查显示器是否有值且不为"错误"
try:
value = float(display_var.get().replace("°", ""))
if "°" in angle_mode_var.get():
angle_mode_var.set("rad")
display_var.set(str(math.radians(value)))
else:
angle_mode_var.set("°")
display_var.set(str(math.degrees(value)) + "°")
except ValueError:
display_var.set("错误")
# 创建窗口
root = tk.Tk()
root.title("科学计算器")
# 显示器
display_var = tk.StringVar()
display = tk.Entry(root, textvariable=display_var, font=("Arial", 30), width=20, justify="right")
display.grid(row=0, column=0, columnspan=6, padx=10, pady=10)
# 角度显示模式
angle_mode_var = tk.StringVar()
angle_mode_var.set("rad") # 默认为弧度模式
angle_mode_button = tk.Button(root, text="弧度/°", command=change_angle_mode, font=("Arial", 12))
angle_mode_button.grid(row=0, column=6, padx=5, pady=5, sticky='nsew')
# 创建按钮
buttons = [
('7', 1, 0, 1, lambda: on_number_click('7')),
('8', 1, 1, 1, lambda: on_number_click('8')),
('9', 1, 2, 1, lambda: on_number_click('9')),
('+', 1, 3, 1, lambda: on_operator_click('+'), 'orange'),
('4', 2, 0, 1, lambda: on_number_click('4')),
('5', 2, 1, 1, lambda: on_number_click('5')),
('6', 2, 2, 1, lambda: on_number_click('6')),
('-', 2, 3, 1, lambda: on_operator_click('-'), 'orange'),
('1', 3, 0, 1, lambda: on_number_click('1')),
('2', 3, 1, 1, lambda: on_number_click('2')),
('3', 3, 2, 1, lambda: on_number_click('3')),
('×', 3, 3, 1, lambda: on_operator_click('*'), 'orange'),
('0', 4, 0, 1, lambda: on_number_click('0')),
('.', 4, 1, 1, lambda: on_number_click('.')),
('=', 4, 2, 1, calculate_result, 'green'),
('÷', 4, 3, 1, lambda: on_operator_click('/'), 'orange'),
('C', 1, 4, 1, on_clear_click, 'red', 'white'),
('⌫', 1, 5, 1, on_delete_click, 'gray', 'white'),
('sin', 2, 4, 1, lambda: calculate_trig('sin', "°" in angle_mode_var.get()), 'skyblue'),
('cos', 3, 4, 1, lambda: calculate_trig('cos', "°" in angle_mode_var.get()), 'skyblue'),
('tan', 4, 4, 1, lambda: calculate_trig('tan', "°" in angle_mode_var.get()), 'skyblue'),
('asin', 2, 5, 1, lambda: calculate_inverse_trig('asin', "°" in angle_mode_var.get()), 'skyblue'),
('acos', 3, 5, 1, lambda: calculate_inverse_trig('acos', "°" in angle_mode_var.get()), 'skyblue'),
('atan', 4, 5, 1, lambda: calculate_inverse_trig('atan', "°" in angle_mode_var.get()), 'skyblue')
]
for button_data in buttons:
text, row, col, width, *args = button_data
button = create_button(text, row, col, width, *args)
# 进入事件循环
root.mainloop()
效果如图,感兴趣自行探索: