01-房贷计算器

背景

  • 看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.

  • 界面不够美化,有待进一步美化;
  • 代码略显杂乱;
  • 继续进步吧。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容