房贷计算器——新增选择还款方式
#!/usr/bin/env python
# coding: utf-8
# In[4]:
'''
文字‘房贷计算器’
文字‘贷款总金额’:输入框
文字‘贷款期限’:输入框
文字‘年利率’:输入框
按钮‘开始计算’
返回:
月供
总利息
'''
from tkinter import *
import time
class Application():
def __init__(self,app=None):
self.app=app
self.application()
self.n1=0
self.e0=self.e1=0
def application(self):
'''
功能一:创建输入界面,包含:标题0、贷款金额1、期限2和利率3
'''
#0房贷计算器
self.label0=Label(self.app,text='房贷计算器',font=('黑体',20)).grid(row=0,column=1)
#1贷款总金额
self.label1=Label(self.app,text='贷款总金额',font=('黑体', 16)).grid(row=1)
#1输入框(贷款总金额)1
self.v1=StringVar()
self.entry1=Entry(self.app,textvariable=self.v1,font=('黑体', 16)).grid(row=1,column=1)
self.label1=Label(self.app,text='贷款总金额',font=('黑体', 16)).grid(row=1)
self.unit1=Label(self.app,text='元',font=('黑体', 16)).grid(row=1,column=2)
#2标签Label2
self.label2=Label(self.app,text='贷款期限',font=('黑体', 16)).grid(row=2)
#2输入框(贷款期限)
self.v2=StringVar()
self.entry2=Entry(self.app,textvariable=self.v2,font=('黑体', 16)).grid(row=2,column=1)
self.unit2=Label(self.app,text='年',font=('黑体', 16)).grid(row=2,column=2)
#3标签Label3
self.label3=Label(self.app,text='年利率',font=('黑体', 16)).grid(row=3)
#3输入框(贷款期限)
self.v3=StringVar()
self.entry3=Entry(self.app,textvariable=self.v3,font=('黑体', 16)).grid(row=3,column=1)
self.unit3=Label(self.app,text='%',font=('黑体', 16)).grid(row=3,column=2)
#选择还款方式:0等额本息;1等额本金
self.var=IntVar()
self.ra0=Radiobutton(self.app,text='等额本息',variable=self.var,value=0,font=('黑体',16))
self.ra0.grid(row=4,column=0)
self.ra1=Radiobutton(self.app,text='等额本金',variable=self.var,value=1,font=('黑体',16))
self.ra1.grid(row=4,column=1)
import math
def fangdai():
'''
房贷计算器
输入:I:年利率 N:年限 a:贷款总额
输出:总利息
'''
def not_num(x):
try:
float(x)
return False
except Exception as e:
return True
#1
if self.v1.get()=='':
self.erro1=Label(self.app,text='请输入贷款总金额',font=('黑体', 10),fg='red')
self.erro1.config(background='white')
self.erro1.grid(row=1,column=1)
self.app.after(3000,self.erro1.destroy)
elif not self.v1.get().isdigit():
self.erro1=Label(self.app,text='请输入数字',font=('黑体', 10),fg='red')
self.erro1.config(background='white')
self.erro1.grid(row=1,column=1)
self.app.after(3000,self.erro1.destroy)
if self.v2.get()=='':
self.erro2=Label(self.app,text='请输入贷款期限',font=('黑体', 10),fg='red')
self.erro2.config(background='white')
self.erro2.grid(row=2,column=1)
self.app.after(3000,self.erro2.destroy)
elif not self.v2.get().isdigit():
self.erro2=Label(self.app,text='请输入数字',font=('黑体', 10),fg='red')
self.erro2.config(background='white')
self.erro2.grid(row=2,column=1)
self.app.after(3000,self.erro2.destroy)
if self.v3.get()=='':
self.erro3=Label(self.app,text='请输入年利率',font=('黑体', 10),fg='red')
self.erro3.config(background='white')
self.erro3.grid(row=3,column=1)
self.app.after(3000,self.erro3.destroy)
elif not_num(self.v3.get()):
print('lalala')
self.erro3=Label(self.app,text='请输入数字',font=('黑体', 10),fg='red')
self.erro3.config(background='white')
self.erro3.grid(row=3,column=1)
self.app.after(3000,self.erro3.destroy)
a=int(self.v1.get())
N=int(self.v2.get())*12
I=float(self.v3.get())*0.01
i=I/12#月利率
if self.var.get()==0:
'''
等额本息
'''
b=(a*i*math.pow((1+i),N))/(math.pow(1+i,N)-1)#月供
zl=0#总利息
for j in range(1,N+1):
#每月利息
l=(a*i-b)*((1+i)**(j-1))+b
zl+=l
if self.e1==1:
self.result2.destroy()
self.result3.destroy()
self.result4.destroy()
print('lalaladddd')
self.result0=Label(self.app,text='总利息='+str(round(zl,2)),font=('黑体', 20))
self.result0.grid(row=7,column=1)
self.result1=Label(self.app,text='月供='+str(round(b,2)),font=('黑体', 20))
self.result1.grid(row=8,column=1)
self.e0=1
else:
'''
等额本金
return:
0总利息
1首月还款
2每月递减
'''
#0总利息
zl=0
for j in range(1,N+1):
l=(a-(j-1)*(a/N))*i
zl+=l
#1首月还款
b=a/N+a*i
#2每月递减
d=a/N*I/12
if self.e0==1:
self.result0.destroy()
self.result1.destroy()
self.result2=Label(self.app,text='总利息='+str(round(zl,2)),font=('黑体', 20))
self.result2.grid(row=7,column=1,columnspan=2)
self.result3=Label(self.app,text='首月还款='+str(round(b,2)),font=('黑体', 20))
self.result3.grid(row=8,column=1,columnspan=2)
self.result4=Label(self.app,text='每月递减='+str(round(d,2)),font=('黑体', 20))
self.result4.grid(row=9,column=1,columnspan=2)
self.e1=1
def get_canvas():
self.img =PhotoImage(file = r'.\IMG_5768.png')
if self.n1==0:
self.n1+=1
self.pic=Label(self.app,image=self.img).grid(columnspan=3)
self.bt=Button(self.app,text='开始计算',command=fangdai,font=('黑体', 16)).grid(row=5,column=1)
self.bt=Button(self.app,text='生成图表',command=get_canvas,font=('黑体', 16)).grid(row=6,column=1)
#以下为添加图表
if __name__=='__main__':
app=Tk()
app.title('房贷计算器')
App=Application(app)
app.geometry('600x600+300+150')#窗口大小设置
app.mainloop()
两种还款方式:等额本息和等额本金
错误提示机制
1、请输入金额
if self.v1.get()=='':
self.erro1=Label(self.app,text='请输入贷款总金额',font=('黑体', 10),fg='red')
self.erro1.config(background='white')
self.erro1.grid(row=1,column=1)
self.app.after(3000,self.erro1.destroy)
2、请输入数字
elif not self.v2.get().isdigit():
self.erro2=Label(self.app,text='请输入数字',font=('黑体', 10),fg='red')
self.erro2.config(background='white')
self.erro2.grid(row=2,column=1)
self.app.after(3000,self.erro2.destroy)