python简易科学计算器

之前做的那个计算器不好看,功能较单一,而且用到的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()




效果如图,感兴趣自行探索:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值