首页 > 编程语言 >程序设计实践 计算器

程序设计实践 计算器

时间:2024-10-20 23:11:57浏览次数:6  
标签:column self 实践 grid tk 计算器 程序设计 frame row

这段代码实现了一个综合计算器应用程序,它使用Python的Tkinter库创建了一个图形用户界面(GUI)。该计算器包含两个主要功能:普通计算器和贷款计算器。下面是对代码的详细解释:

1. 导入模块

import tkinter as tk
from tkinter import messagebox
from math import sqrt
  • tkinter:用于创建GUI应用程序。
  • messagebox:用于显示消息框。
  • sqrt:用于计算平方根。

2. 定义计算器应用程序类

class CalcApp:
    def __init__(self, root):
        self.root = root
        self.root.title("综合计算器")
        self.mode = tk.StringVar(value="普通计算器")
        self.create_menu()
        self.norm_frame = tk.Frame(self.root)
        self.mort_frame = tk.Frame(self.root)
        self.create_norm_calc(self.norm_frame)
        self.create_mort_calc(self.mort_frame)
        self.norm_frame.grid(row=1, column=0, padx=10, pady=10)
  • __init__方法初始化应用程序,设置窗口标题,创建菜单和两个计算器界面(普通计算器和贷款计算器)。

3. 创建菜单

def create_menu(self):
    modes = ["普通计算器", "贷款计算器"]
    tk.OptionMenu(self.root, self.mode, *modes, command=self.switch_mode).grid(row=0, column=0, padx=10, pady=10)
  • 创建一个下拉菜单,用于选择计算器模式(普通计算器或贷款计算器)。

4. 切换模式

def switch_mode(self, mode):
    if mode == "普通计算器":
        self.mort_frame.grid_forget()
        self.norm_frame.grid(row=1, column=0, padx=10, pady=10)
    else:
        self.norm_frame.grid_forget()
        self.mort_frame.grid(row=1, column=0, padx=10, pady=10)
  • 根据选择的模式切换不同的界面。

5. 创建普通计算器界面

def create_norm_calc(self, frame):
    self.expr = ""
    self.res = tk.StringVar()
    self.display = tk.Entry(frame, textvariable=self.res, font=('Arial', 20), bd=10, insertwidth=4, width=14, borderwidth=4)
    self.display.grid(row=0, column=0, columnspan=4)
    btns = [
        ('7', 1, 0), ('8', 1, 1), ('9', 1, 2), ('/', 1, 3),
        ('4', 2, 0), ('5', 2, 1), ('6', 2, 2), ('*', 2, 3),
        ('1', 3, 0), ('2', 3, 1), ('3', 3, 2), ('-', 3, 3),
        ('0', 4, 0), ('.', 4, 1), ('+', 4, 2), ('=', 4, 3),
        ('C', 5, 0), ('←', 5, 1), ('sqrt', 5, 2), ('%', 5, 3),
        ('(', 6, 0), (')', 6, 1), ('^', 6, 2), ('1/x', 6, 3)
    ]
    for (text, row, col) in btns:
        btn = tk.Button(frame, text=text, padx=20, pady=20, font=('Arial', 18), command=lambda t=text: self.on_btn_click(t))
        btn.grid(row=row, column=col, sticky="nsew")
    for i in range(7):
        frame.grid_rowconfigure(i, weight=1)
    for i in range(4):
        frame.grid_columnconfigure(i, weight=1)
  • 创建普通计算器的界面,包括显示框和按钮。

6. 普通计算器按钮点击事件

def on_btn_click(self, char):
    if char == '=':
        try:
            self.expr = str(eval(self.expr))
        except Exception:
            self.expr = "Error"
    elif char == 'C':
        self.expr = ""
    elif char == '←':
        self.expr = self.expr[:-1]
    elif char == 'sqrt':
        self.expr += 'sqrt('
    elif char == '1/x':
        self.expr += '1/('
    else:
        self.expr += str(char)
    self.res.set(self.expr)
  • 处理按钮点击事件,更新表达式并显示结果。

7. 创建贷款计算器界面

def create_mort_calc(self, frame):
    self.pay_type = tk.StringVar(value="等额本息")
    self.years = tk.StringVar()
    self.amount = tk.StringVar()
    self.rate = tk.StringVar()
    self.monthly_pay = tk.StringVar()
    self.total_int = tk.StringVar()
    self.total_pay = tk.StringVar()
    tk.Label(frame, text="还款方式:").grid(row=0, column=0, padx=5, pady=5, sticky='w')
    tk.Radiobutton(frame, text="等额本息", variable=self.pay_type, value="等额本息").grid(row=0, column=1)
    tk.Radiobutton(frame, text="等额本金", variable=self.pay_type, value="等额本金").grid(row=0, column=2)
    tk.Label(frame, text="贷款年限(年):").grid(row=1, column=0, padx=5, pady=5, sticky='w')
    tk.Entry(frame, textvariable=self.years).grid(row=1, column=1, columnspan=2)
    tk.Label(frame, text="贷款金额(万元):").grid(row=2, column=0, padx=5, pady=5, sticky='w')
    tk.Entry(frame, textvariable=self.amount).grid(row=2, column=1, columnspan=2)
    tk.Label(frame, text="贷款利率(%):").grid(row=3, column=0, padx=5, pady=5, sticky='w')
    tk.Entry(frame, textvariable=self.rate).grid(row=3, column=1, columnspan=2)
    tk.Button(frame, text="计算", command=self.calc_mort).grid(row=4, column=0, columnspan=2, pady=10)
    tk.Button(frame, text="重置", command=self.reset_mort).grid(row=4, column=2, pady=10)
    tk.Label(frame, text="月均还款(元):").grid(row=5, column=0, padx=5, pady=5, sticky='w')
    tk.Entry(frame, textvariable=self.monthly_pay, state='readonly').grid(row=5, column=1, columnspan=2)
    tk.Label(frame, text="利息总额(元):").grid(row=6, column=0, padx=5, pady=5, sticky='w')
    tk.Entry(frame, textvariable=self.total_int, state='readonly').grid(row=6, column=1, columnspan=2)
    tk.Label(frame, text="还款总额(元):").grid(row=7, column=0, padx=5, pady=5, sticky='w')
    tk.Entry(frame, textvariable=self.total_pay, state='readonly').grid(row=7, column=1, columnspan=2)
  • 创建贷款计算器的界面,包括输入框和按钮。

8. 贷款计算器计算逻辑

def calc_mort(self):
    try:
        yrs = int(self.years.get())
        princ = float(self.amount.get()) * 10000
        rate_yr = float(self.rate.get()) / 100
        months = yrs * 12
        rate_mth = rate_yr / 12
        if self.pay_type.get() == "等额本息":
            m_pay = princ * rate_mth * ((1 + rate_mth) ** months) / (((1 + rate_mth) ** months) - 1)
            total_pay = m_pay * months
            total_int = total_pay - princ
        else:
            m_pay = princ / months + (princ * rate_mth)
            total_pay = (months + 1) * princ * rate_mth / 2 + princ
            total_int = total_pay - princ
        self.monthly_pay.set(f"{m_pay:.2f}")
        self.total_int.set(f"{total_int:.2f}")
        self.total_pay.set(f"{total_pay:.2f}")
    except ValueError:
        messagebox.showerror("输入错误", "请输入有效的数字")
  • 根据用户输入计算贷款的月均还款、利息总额和还款总额。

9. 重置贷款计算器输入和输出

def reset_mort(self):
    self.years.set("")
    self.amount.set("")
    self.rate.set("")
    self.monthly_pay.set("")
    self.total_int.set("")
    self.total_pay.set("")
  • 重置贷款计算器的输入和输出。

10. 主程序

if __name__ == "__main__":
    root = tk.Tk()
    app = CalcApp(root)
    root.mainloop()
  • 创建Tkinter窗口并运行应用程序。

注意事项

  • 该代码在计算贷款时,将贷款金额从万元转换为元,因此在输入贷款金额时,需要输入万元。
  • 在计算贷款时,使用了等额本息和等额本金两种还款方式,用户可以通过选择不同的还款方式来计算。
  • 在计算贷款时,使用了异常处理来处理用户输入无效的情况。

标签:column,self,实践,grid,tk,计算器,程序设计,frame,row
From: https://www.cnblogs.com/Elgina/p/18488123

相关文章

  • 《计算机基础与程序设计》第四周学习总结
    学期(2024-2025-1)学号(20241412)《计算机基础与程序设计》第四周学习总结作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里2024-2025-1计算机基础与程序设计第一周作业https:......
  • 2024-2025 20241318 《计算机基础与程序设计》第四周学习总结
    这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK04这个作业的目标自学教材计算机科学概论(第七版)第4章,第5章并完成云班课测试《C语言程序设计》第3章并完成......
  • 2024-2025-1 20241419《计算机基础与程序设计》第四周学习总结
    作业信息课程要求目标:门电路组合电路,逻辑电路冯诺依曼结构CPU,内存,IO管理嵌入式系统,并行结构物理安全作业正文教程学习内容总结:数字电路:门电路:实现逻辑运算的单元电路,包括与、或、非等。组合电路:输出仅与当前输入有关的数字电路。逻辑电路:由逻辑门组成,输入输出信号......
  • 2024-2025-1 20241329 《计算机基础与程序设计》第四周学习总结
    作业信息作业归属课程:https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP作业要求:https://www.cnblogs.com/rocedu/p/9577842.html#WEEK04作业目标:门电路;组合电路,逻辑电路;冯诺依曼结构;CPU,内存,IO管理;嵌入式系统,并行结构;物理安全作业正文:https://www.cnblogs.com/incamelli......
  • 2024 CCPC第五届辽宁省程序设计竞赛 集训1
    A.左移#include<bits/stdc++.h>usingnamespacestd;intmain(){intT;cin>>T;while(T--){strings;cin>>s;intans=-1;if(s.front()==s.back())ans=0;else{......
  • 学习笔记—微服务—技术栈实践(1)—注册中心与配置中心
    注册中心什么是注册中心  注册中心是SpringCloud和SpringCloudAlibaba系列的第一步。服务的注册与发现是最基本的操作。  在微服务中,注册中心主要体现为三种角色。首先是服务注册中心,也就是Registry,用于保存服务提供者的注册信息,当服务提供者的节点发生变更的时候......
  • #2024-2025-1学号20241309《计算机基础与程序设计》第四周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第四周作业这个作业的目标|作业正文|2024-2025-1学号20241309《计算机基础与程序设计》第四周学习总结教材学习内容总结《计算机科学概论》......
  • 选择结构程序设计
    在顺序结构中,各语句都是按自上而下的顺序执行的,执行完上一个语句就自动执行下一个语句,是无条件的,不必做任何判断。这是最简单的程序结构。实际上,在很多情况下,需要根据某个条件是否满足来决定是否执行指定的操作任务,或者从给定的两种或多种操作选择其一。这就是选择结构要解决的问......
  • 2024-2025-1 20241312 《计算机基础与程序设计》第4周学习总结
    作业信息|这个作业属于哪个课程|<班级的链接>(如2024-2025-1-计算机基础与程序设计)||这个作业要求在哪里|<作业要求的链接>(如2024-2025-1计算机基础与程序设计第四周作业||这个作业的目标|门电路组合电路,逻辑电路冯诺依曼结构CPU,内存,IO管理嵌入式系统,并行结构物理安全||作业......
  • 2024-2025-1 20241308 《计算机基础与程序设计》第四周学习总结
    作业信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK04这个作业的目标 <门电路组合电路,逻辑电路冯诺依曼结构CPU,内存,IO管理嵌入式系统,并行结构物理安全>作业正......