01-房贷计算器

背景

  • 看Crossin的编程教室,发现近期有一个房贷计算器的小题目,根据最近几个月的学习,尝试编写下GUI界面房贷计算器;
  • tkinter原来也就了解了下,没有真正动手去尝试,正好有机会尝试。

思路

1.房贷计算器有很多的版本,选取了支付宝里的应用,仿照界面进行编写;
2.实现两种房贷计算方法:等额本金等额本息,利用复选框隐藏指示实现;
3.输入贷款金额“万元”为单位,输出为“元”,结果保留2位小数;
4.年限和利率下拉选框实现

买家和卖家秀

  • 卖家


    01-房贷计算器_第1张图片
    ZFB.jpg
  • 买家


    01-房贷计算器_第2张图片
    Fixed-Payment.jpg

具体函数

1.显示界面

       self.root = Tk()
       self.root.geometry('400x400')
       self.root.title('房贷计算器')

       # 输入和选框值
       self.funcchose = StringVar()  # 复选框变量
       self.years = 0  # 贷款时间
       self.str_rates = StringVar()  # 贷款利率
       self.amount = 0.0  # 贷款金额(万)
       self.month_rates = 0.0  # 月利率
       self.monthpay = 0.0  # 每月还款金额
       self.mondec = 0.0  # 每月递减
       self.interest = 0.0  # 总利息
       self.totalmoney = 0.0 # 总还款
       self.Combobox1 = ('基准利率', '7折利率', '8折利率', '8.3折利率', '8.5折利率', '8.8折利率',
                         '9折利率', '9.5折利率', '1.05倍利率', '1.1倍利率', '1.2倍利率', '1.3倍利率')
       self.Combobox2 = (5, 10, 15, 20, 25, 30)
       self.baserates = 0.049  # 基准利率
       self.havepaid = 0.0  # 已还款

       # 各类金额显示
       self.L1 = Label(self.root, text=self.monthpay, font='Times 20 bold')
       self.L1.place(x=5, y=80)
       self.L2 = Label(self.root, text=self.mondec, font='Times 20 bold')
       self.L2.place(x=190, y=80)
       self.L3 = Label(self.root, text=self.interest, font='Times 20 bold')
       self.L3.place(x=5, y=150)
       self.L4 = Label(self.root, text=self.totalmoney, font='Times 20 bold')
       self.L4.place(x=190, y=150)

       # 各类金额名称
       Label(self.root, text='Reference Payment Each Month(CYN)', wraplength=180, justify='left').place(x=5, y=50)
       self.L5 = Label(self.root, text='Decrease in Each Month(CNY)')
       self.L5.place(x=190, y=50)  # 等额本息情况不显示
       Label(self.root, text='Pay Interest(CNY)').place(x=5, y=130)
       Label(self.root, text='Payoff Amount(CNY)').place(x=190, y=130)

       # 显示金额和输入之间的过度部分
       Label(self.root, text='Fixed-Payment Details', font='Times 10 bold').place(x=120, y=190)

       # 输入部分标签
       Label(self.root, text='Amount(10k)', font='Times 15').place(x=20, y=210)
       Label(self.root, text='Due Time(year)', font='Times 15').place(x=20, y=250)
       Label(self.root, text='Interest Rate(%)', font='Times 15').place(x=20, y=290)

       # 两个下拉列表
       self.yearschoes = ttk.Combobox(self.root, font='Times 15', textvariable=self.years)
       self.yearschoes['values'] = self.Combobox2
       self.yearschoes.place(x=180, y=250)
       self.yearschoes.current(0)

       self.rateschose = ttk.Combobox(self.root, font='Times 15', textvariable=self.str_rates)
       self.rateschose['values'] = self.Combobox1
       self.rateschose.place(x=180, y=290)
       self.rateschose.current(0)

       # 一个只能输入数字的输入框,整数部分最大9999,最多由两位小数
       self.E1 = Entry(self.root, justify=RIGHT,
                   textvariable=self.amount,
                   font='Times 15',
                   validate='key',
                   validatecommand=(self.root.register(self.OnlyDigit), '%P'))  # 每次输入内容变化时,都会调用该指令
       self.E1.place(x=180, y=210)

       # 两种不同计算方式
       Radiobutton(self.root, text="Fixed-Payment",
                   variable=self.funcchose,
                   value= 1,
                   indicatoron=False,
                   width=20,
                   command = self.DEBXHK,
                   height=2).place(x=50, y=10)

       Radiobutton(self.root, text="Fixed-Basis",
                   variable=self.funcchose,
                   value= 0,
                   indicatoron=False,
                   width=20,
                   command = self.DEBJHK,
                   height=2).place(x=180, y=10)

       # 注意信息
       Label(self.root, text='This is the latest Loan Rate released by PBOC on 2016', font='Times 8').place(x=5, y=320)
       self.root.mainloop()

2.等额本息还款

def DEBXHK(self):
        self.years = int(self.GetItem(self.yearschoes))
        self.StrrateToMonthrate(self.GetItem(self.rateschose))
        self.amount = self.Amount()
        self.monthpay = self.month_rates * np.power((1 + self.month_rates), self.years*12)/\
                        (np.power((1 + self.month_rates), self.years*12) - 1.0) *self.amount
        # print(self.monthpay, self.years, self.month_rates, self.amount)

        self.ReNew(round(self.monthpay, 2), '', round(self.monthpay*self.years*12-self.amount, 2),
                    round(self.monthpay*self.years*12, 2), '')
        self.Reset()

3.等额本金还款

def DEBJHK(self):
        self.years = int(self.GetItem(self.yearschoes))
        self.StrrateToMonthrate(self.GetItem(self.rateschose))
        self.amount = self.Amount()
        for i in range(self.years*12):
            if i == 0:
                self.firstmonth = self.amount/(self.years*12) + (self.amount - self.havepaid) * self.month_rates
                self.havepaid = self.firstmonth
            else:
                self.nextmonth = self.amount/(self.years*12) +\
                                (self.amount -self.amount/(self.years*12)*i) * self.month_rates

                self.havepaid += self.nextmonth

        self.mondec = self.amount/(self.years*12)*self.month_rates

        self.ReNew(round(self.firstmonth, 2), round(self.mondec, 2),
                    round(self.havepaid-self.amount, 2), round(self.havepaid, 2), 'Decrease in Each Month(CNY)')
        self.Reset()

结语

具体代码请查看我的github:https://github.com/Damon0626.

  • 界面不够美化,有待进一步美化;
  • 代码略显杂乱;
  • 继续进步吧。

你可能感兴趣的:(01-房贷计算器)