背景
- 看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.
- 界面不够美化,有待进一步美化;
- 代码略显杂乱;
- 继续进步吧。
网友评论