python小项目——房贷计算器
·
python小项目
房贷计算器
- src下新建python文件,loan.py,内容如下:
import tkinter as tk
from tkinter import ttk, messagebox
def calculate_loan():
"""计算房贷:支持商业、公积金、组合贷 + 两种还款方式"""
try:
# 获取基础输入
loan_type = current_loan_type.get()
repayment_type = var_repayment.get()
# 商业贷款
amount1 = float(entry_amount.get()) * 10000 if entry_amount.get() else 0
rate1 = float(entry_rate1.get().replace('%', '')) / 100 if entry_rate1.get() else 0.038
# 公积金贷款(组合贷使用)
amount2 = float(entry_amount2.get()) * 10000 if (loan_type == "组合贷款" and entry_amount2.get()) else 0
rate2 = float(entry_rate2.get().replace('%', '')) / 100 if (loan_type == "组合贷款" and entry_rate2.get()) else 0.029
# 贷款年限
years = int(combobox_years.get().split('年')[0])
months = years * 12
total_monthly = 0
total_payment = 0
total_interest = 0
first_month = 0
last_month = 0
def calc_single(principal, annual_rate, months, r_type):
if principal <= 0:
return 0, 0, 0, 0
monthly_rate = annual_rate / 12
if r_type == "等额本息":
if monthly_rate == 0:
m = principal / months
else:
m = principal * monthly_rate * (1 + monthly_rate) ** months / ((1 + monthly_rate) ** months - 1)
t = m * months
i = t - principal
return m, t, i, 0
else:
mp = principal / months
first = mp + principal * monthly_rate
last = mp + mp * monthly_rate
interest = 0
for x in range(months):
interest += (principal - x * mp) * monthly_rate
total = principal + interest
return first, total, interest, last
if loan_type == "商业贷款":
m1, t1, i1, _ = calc_single(amount1, rate1, months, repayment_type)
total_monthly = m1
total_payment = t1
total_interest = i1
elif loan_type == "公积金贷款":
m1, t1, i1, _ = calc_single(amount1, rate2, months, repayment_type)
total_monthly = m1
total_payment = t1
total_interest = i1
else:
f1, t1, i1, l1 = calc_single(amount1, rate1, months, repayment_type)
f2, t2, i2, l2 = calc_single(amount2, rate2, months, repayment_type)
total_payment = t1 + t2
total_interest = i1 + i2
if repayment_type == "等额本息":
total_monthly = f1 + f2
else:
first_month = f1 + f2
last_month = l1 + l2
res = ""
if loan_type != "组合贷款":
if repayment_type == "等额本息":
res = f"✅ {loan_type} - 等额本息\n每月月供:{total_monthly:.2f} 元\n还款总额:{total_payment:.2f} 元\n总利息:{total_interest:.2f} 元"
else:
res = f"✅ {loan_type} - 等额本金\n首月月供:{total_monthly:.2f} 元\n末月月供:{total_monthly:.2f} 元\n还款总额:{total_payment:.2f} 元\n总利息:{total_interest:.2f} 元"
else:
if repayment_type == "等额本息":
res = f"✅ 组合贷款 - 等额本息\n每月月供:{total_monthly:.2f} 元\n还款总额:{total_payment:.2f} 元\n总利息:{total_interest:.2f} 元"
else:
res = f"✅ 组合贷款 - 等额本金\n首月月供:{first_month:.2f} 元\n末月月供:{last_month:.2f} 元\n还款总额:{total_payment:.2f} 元\n总利息:{total_interest:.2f} 元"
result_text.set(res)
except ValueError:
messagebox.showerror("输入错误", "请输入正确的数字!")
def switch_loan_type(typ):
"""切换贷款类型:商业 / 公积金 / 组合"""
current_loan_type.set(typ)
btn_commercial.config(bg="#409EFF" if typ == "商业贷款" else "white", fg="white" if typ == "商业贷款" else "#666")
btn_gjj.config(bg="#409EFF" if typ == "公积金贷款" else "white", fg="white" if typ == "公积金贷款" else "#666")
btn_combination.config(bg="#409EFF" if typ == "组合贷款" else "white", fg="white" if typ == "组合贷款" else "#666")
if typ == "商业贷款":
label_amount2.grid_remove()
entry_amount2.grid_remove()
label_rate2.grid_remove()
entry_rate2.grid_remove()
label_rate1.config(text="商业利率")
entry_rate1.delete(0, tk.END)
entry_rate1.insert(0, "3.8%")
elif typ == "公积金贷款":
label_amount2.grid_remove()
entry_amount2.grid_remove()
label_rate2.grid_remove()
entry_rate2.grid_remove()
label_rate1.config(text="公积金利率")
entry_rate1.delete(0, tk.END)
entry_rate1.insert(0, "2.9%")
else:
label_amount2.grid()
entry_amount2.grid()
label_rate2.grid()
entry_rate2.grid()
label_rate1.config(text="商业利率")
entry_rate1.delete(0, tk.END)
entry_rate1.insert(0, "3.8%")
entry_rate2.delete(0, tk.END)
entry_rate2.insert(0, "2.9%")
# ------------------- 主界面 -------------------
root = tk.Tk()
root.title("房贷计算器")
root.geometry("600x700")
root.resizable(True, True)
# 样式
style = ttk.Style()
style.configure(".", font=("微软雅黑", 13))
# 标题
title_frame = tk.Frame(root, bg="#409EFF", height=110)
title_frame.pack(fill=tk.X, padx=0, pady=0)
title_frame.pack_propagate(False)
tk.Label(title_frame, text="房贷计算器", font=("微软雅黑", 28, "bold"), bg="#409EFF", fg="white").pack(pady=(20, 5))
tk.Label(title_frame, text="支持商业 / 公积金 / 组合贷款", font=("微软雅黑", 13), bg="#409EFF", fg="white").pack()
# 城市 + 贷款类型
top_frame = tk.Frame(root)
top_frame.pack(fill=tk.X, padx=25, pady=15)
tk.Label(top_frame, text="📍 南京", font=("微软雅黑", 15)).pack(side=tk.LEFT)
loan_frame = tk.Frame(top_frame)
loan_frame.pack(side=tk.RIGHT)
current_loan_type = tk.StringVar(value="商业贷款")
btn_commercial = tk.Button(loan_frame, text="商业贷款", font=("微软雅黑", 13), bg="#409EFF", fg="white",
relief=tk.FLAT, padx=10, pady=4, command=lambda: switch_loan_type("商业贷款"))
btn_gjj = tk.Button(loan_frame, text="公积金贷款", font=("微软雅黑", 13), bg="white", fg="#666",
relief=tk.FLAT, padx=10, pady=4, command=lambda: switch_loan_type("公积金贷款"))
btn_combination = tk.Button(loan_frame, text="组合贷款", font=("微软雅黑", 13), bg="white", fg="#666",
relief=tk.FLAT, padx=10, pady=4, command=lambda: switch_loan_type("组合贷款"))
btn_commercial.grid(row=0, column=0, padx=8)
btn_gjj.grid(row=0, column=1, padx=8)
btn_combination.grid(row=0, column=2, padx=8)
# 还款方式
repay_frame = tk.Frame(root)
repay_frame.pack(fill=tk.X, padx=30, pady=8)
tk.Label(repay_frame, text="还款方式", font=("微软雅黑", 14)).pack(side=tk.LEFT)
var_repayment = tk.StringVar(value="等额本息")
ttk.Radiobutton(repay_frame, text="等额本息", variable=var_repayment, value="等额本息").pack(side=tk.RIGHT, padx=15)
ttk.Radiobutton(repay_frame, text="等额本金", variable=var_repayment, value="等额本金").pack(side=tk.RIGHT)
# 网格布局:自适应拉伸
grid_frame = tk.Frame(root)
grid_frame.pack(fill=tk.X, padx=30, pady=10)
for col in range(2):
grid_frame.grid_columnconfigure(col, weight=1)
# 贷款总额
tk.Label(grid_frame, text="贷款总额", font=("微软雅黑", 14)).grid(row=0, column=0, sticky="w", pady=8)
entry_amount = ttk.Entry(grid_frame, font=("微软雅黑", 14))
entry_amount.grid(row=0, column=1, sticky="ew", pady=8)
entry_amount.insert(0, "100")
tk.Label(grid_frame, text="万元", font=("微软雅黑", 13)).grid(row=0, column=1, sticky="e", padx=10)
# 组合贷 - 公积金金额
label_amount2 = tk.Label(grid_frame, text="公积金金额", font=("微软雅黑", 14))
entry_amount2 = ttk.Entry(grid_frame, font=("微软雅黑", 14))
label_amount2.grid(row=1, column=0, sticky="w", pady=8)
entry_amount2.grid(row=1, column=1, sticky="ew", pady=8)
entry_amount2.insert(0, "50")
tk.Label(grid_frame, text="万元", font=("微软雅黑", 13)).grid(row=1, column=1, sticky="e", padx=10)
# 利率1
label_rate1 = tk.Label(grid_frame, text="商业利率", font=("微软雅黑", 14))
entry_rate1 = ttk.Entry(grid_frame, font=("微软雅黑", 14))
label_rate1.grid(row=2, column=0, sticky="w", pady=8)
entry_rate1.grid(row=2, column=1, sticky="ew", pady=8)
entry_rate1.insert(0, "3.8%")
# 利率2(组合贷)
label_rate2 = tk.Label(grid_frame, text="公积金利率", font=("微软雅黑", 14))
entry_rate2 = ttk.Entry(grid_frame, font=("微软雅黑", 14))
label_rate2.grid(row=3, column=0, sticky="w", pady=8)
entry_rate2.grid(row=3, column=1, sticky="ew", pady=8)
entry_rate2.insert(0, "2.9%")
# 贷款期限
tk.Label(grid_frame, text="贷款期限", font=("微软雅黑", 14)).grid(row=4, column=0, sticky="w", pady=8)
combobox_years = ttk.Combobox(grid_frame, values=["10年", "20年", "30年"], font=("微软雅黑", 14), state="readonly")
combobox_years.grid(row=4, column=1, sticky="ew", pady=8)
combobox_years.current(2)
# 计算按钮
btn_calc = tk.Button(root, text="开始计算", font=("微软雅黑", 16, "bold"), bg="#409EFF", fg="white",
padx=30, pady=10, command=calculate_loan)
btn_calc.pack(pady=20, fill=tk.X, padx=30)
# 结果面板
result_frame = tk.Frame(root, bg="#f5f7fa", relief=tk.GROOVE, bd=1)
result_frame.pack(fill=tk.BOTH, expand=True, padx=30, pady=10)
result_text = tk.StringVar()
result_label = tk.Label(result_frame, textvariable=result_text, font=("微软雅黑", 13), bg="#f5f7fa", justify=tk.LEFT, anchor="nw")
result_label.pack(fill=tk.BOTH, expand=True, padx=15, pady=15)
# 默认加载商业贷款
switch_loan_type("商业贷款")
root.mainloop()
-
安装相关软件包
在”终端“中执行
python -m ensurepip --upgrade pip install paramiko scp python.exe -m pip install --upgrade pip -
运行测试:右键loan.py,运行。

-
在终端中运行
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple/ pyinstaller -F -w src\loan.pyloan.py是python 代码文件,pyinstaller -F -w src\loan.py编译成二进制文件
-
项目目录D:\PycharmProjects\pythonProject的dist目录下生成loan.exe,双击可以直接运行

更多推荐


所有评论(0)