Python房贷计算器GUI(等额本息,等额本金)

1. 源码

from tkinter import *


class Calculator:
    def __init__(self):
        window = Tk()  # 建立窗口
        window.title("房贷计算器")  # 命名窗口标题

        # 定义StringVar对象动态存储输入框的值
        self.amountVar = StringVar()  # 贷款金额
        self.rateVar = StringVar()  # 年化利率
        self.yearsVar = StringVar()  # 贷款年限
        self.monthsVar = StringVar()  # 已还期数
        self.monthVar = StringVar()  # 第i月
        self.total_1Var = StringVar()  # 等额本息总还款额
        self.totalInterest_1Var = StringVar()  # 等额本息总利息
        self.totalRepayment_1Var = StringVar()  # 等额本息累计已还
        self.remain_1Var = StringVar()  # 等额本息待还金额
        self.monthRepayment_1Var = StringVar()  # 等额本息第i月应还
        self.total_2Var = StringVar()  # 等额本金总还款额
        self.totalInterest_2Var = StringVar()  # 等额本金总利息
        self.totalRepayment_2Var = StringVar()  # 等额本金累计已还
        self.remain_2Var = StringVar()  # 等额本金待还金额
        self.monthRepayment_2Var = StringVar()  # 等额本金第i月应还

        # 设置一些默认值
        self.monthsVar.set("0")
        self.monthVar.set('1')

        # 整体面板,设置总体的边距
        frame = Frame(window)
        frame.pack(padx=20, pady=20)

        """
        添加标签
        .grid(row, column)设置标签位置
        """
        Label(frame, text="贷款金额").grid(row=1, column=1, columnspan=3)
        Label(frame, text="年化利率").grid(row=2, column=1, columnspan=3)
        Label(frame, text="贷款年限").grid(row=3, column=1, columnspan=3)
        Label(frame, text="已还期数").grid(row=4, column=1, columnspan=3)
        Label(frame, text="总还款额").grid(row=7, column=1, columnspan=3)
        Label(frame, text="总利息额").grid(row=8, column=1, columnspan=3)
        Label(frame, text="累计已还").grid(row=9, column=1, columnspan=3)
        Label(frame, text="剩余待还").grid(row=10, column=1, columnspan=3)
        Label(frame, text="第").grid(row=11, column=1)
        Label(frame, text="月应还").grid(row=11, column=3)

        """
        添加输入和输出框
        textvariable = self.amountVar 由相应的StringVar对象动态保存输入框中的文本
        justify=RIGHT 输入框中的文本右对齐
        sticky=E 控件在单元格中右对齐
        """
        Entry(frame, justify=RIGHT, textvariable=self.amountVar).grid(row=1, column=4)
        Entry(frame, justify=RIGHT, textvariable=self.rateVar).grid(row=2, column=4)
        Entry(frame, justify=RIGHT, textvariable=self.yearsVar).grid(row=3, column=4)
        Entry(frame, justify=RIGHT, textvariable=self.monthsVar).grid(row=4, column=4)
        Entry(frame, width=4, justify=CENTER, textvariable=self.monthVar).grid(row=11, column=2)
        Label(frame, textvariable=self.total_1Var).grid(row=7, column=4, sticky=E)
        Label(frame, textvariable=self.total_2Var).grid(row=7, column=6, sticky=E)
        Label(frame, textvariable=self.totalInterest_1Var).grid(row=8, column=4, sticky=E)
        Label(frame, textvariable=self.totalInterest_2Var).grid(row=8, column=6, sticky=E)
        Label(frame, textvariable=self.totalRepayment_1Var).grid(row=9, column=4, sticky=E)
        Label(frame, textvariable=self.totalRepayment_2Var).grid(row=9, column=6, sticky=E)
        Label(frame, textvariable=self.remain_1Var).grid(row=10, column=4, sticky=E)
        Label(frame, textvariable=self.remain_2Var).grid(row=10, column=6, sticky=E)
        Label(frame, textvariable=self.monthRepayment_1Var).grid(row=11, column=4, sticky=E)
        Label(frame, textvariable=self.monthRepayment_2Var).grid(row=11, column=6, sticky=E)

        # 添加Message存储单位
        Message(frame, text="元").grid(row=1, column=5)
        Message(frame, text="%").grid(row=2, column=5)
        Message(frame, text="年").grid(row=3, column=5)
        Message(frame, text="月").grid(row=4, column=5)
        Message(frame, text="元").grid(row=7, column=5)
        Message(frame, text="元").grid(row=7, column=7)
        Message(frame, text="元").grid(row=8, column=5)
        Message(frame, text="元").grid(row=8, column=7)
        Message(frame, text="元").grid(row=9, column=5)
        Message(frame, text="元").grid(row=9, column=7)
        Message(frame, text="元").grid(row=10, column=5)
        Message(frame, text="元").grid(row=10, column=7)
        Message(frame, text="元").grid(row=11, column=5)
        Message(frame, text="元").grid(row=11, column=7)

        # 空Frame以撑开空间
        Frame(frame, height=10).grid(row=5, column=4, columnspan=7)

        # 按钮,事件监听函数为calculate
        Button(frame, width=19, text="等额本息", command=self.calculate_1).grid(row=6, column=4, columnspan=1, pady=0)
        Button(frame, width=19, text="等额本金", command=self.calculate_2).grid(row=6, column=6, columnspan=1, pady=0)

        # 消息循环
        window.mainloop()

    # 按钮点击监听
    def calculate_1(self):
        """
        等额本息法计算函数
        """
        # 获取输入的参数
        amount = eval(self.amountVar.get())
        rate = eval(self.rateVar.get()) / 100 / 12  # 将年化利率转为月利率,单位为1
        years = eval(self.yearsVar.get())
        months = eval(self.monthsVar.get())
        month = eval(self.monthVar.get())

        # 计算每月还款
        monthRepayment = amount * rate * ((1 + rate ) ** (years * 12)) / ((1 + rate ) ** (years * 12) - 1)

        # 将计算结果设置给控件
        total = monthRepayment * 12 * years  # 总还款金额
        self.total_1Var.set(format(total, ".3f"))

        totalInterest = total - amount  # 总利息
        self.totalInterest_1Var.set(format(totalInterest, '.3f'))

        if (months >= 0) and (months <= years * 12):  # 已还期数必须在贷款期数内
            totalRepayment = monthRepayment * months  # 已还金额
            remain = total - totalRepayment  # 剩余待还金额
            self.totalRepayment_1Var.set(format(totalRepayment, '.3f'))
            self.remain_1Var.set(format(remain, '.3f'))
        else:
            self.totalRepayment_1Var.set('已还期数输入有误!')
            self.remain_1Var.set('已还期数输入有误!')

        if (month >= 1) and (month <= years * 12):
            self.monthRepayment_1Var.set(format(monthRepayment, '.3f'))
        else:
            self.monthRepayment_1Var.set('第_月份输入有误!')

    def calculate_2(self):
        """
        等额本金法计算函数
        """
        # 获取输入的参数
        amount = eval(self.amountVar.get())
        rate = eval(self.rateVar.get()) / 100 / 12  # 将年化利率转为月利率,单位为1
        years = eval(self.yearsVar.get())
        months = eval(self.monthsVar.get())
        month = eval(self.monthVar.get())
        month_amount = amount / (years * 12)

        # 存储每月还款
        monthRepayment = []
        for i in range(1, (years * 12) + 1):
            monthpayment = month_amount + (amount - (i - 1) * month_amount) * rate
            monthRepayment.append(monthpayment)

        # 将计算结果设置给控件
        total = sum(monthRepayment)
        self.total_2Var.set(format(total, ".3f"))

        totalInterest = total - amount
        self.totalInterest_2Var.set(format(totalInterest, '.3f'))

        if (months >= 0) and (months <= years * 12):
            totalRepayment = sum(monthRepayment[:months])
            remain = total - totalRepayment
            self.totalRepayment_2Var.set(format(totalRepayment, '.3f'))
            self.remain_2Var.set(format(remain, '.3f'))
        else:
            self.totalRepayment_2Var.set('已还期数输入有误!')
            self.remain_2Var.set('已还期数输入有误!')

        if (month >= 1) and (month <= years * 12):
            self.monthRepayment_2Var.set(format(monthRepayment[month - 1], '.3f'))
        else:
            self.monthRepayment_2Var.set('第_月份输入有误!')


if __name__ == '__main__':
    Calculator()
    pass

2. 运行结果

Python房贷计算器GUI(等额本息,等额本金)_第1张图片

88-1房贷计算器

运行上面的代码可以得到上图这样的一个房贷计算器。

房贷计算器GUI

源码来源于网络,如有侵权,联系删除!

今天在网上发现了上面的宝藏代码。

 

你可能感兴趣的:(python,开发语言)