美文网首页
01-房贷计算器

01-房贷计算器

作者: Damon0626 | 来源:发表于2018-07-07 15:47 被阅读15次

    背景

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

    思路

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

    买家和卖家秀

    • 卖家


      ZFB.jpg
    • 买家


      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-房贷计算器

          本文链接:https://www.haomeiwen.com/subject/klgwuftx.html