python小项目

房贷计算器

  1. 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()
  1. 安装相关软件包

    在”终端“中执行

    python -m ensurepip --upgrade
    pip install paramiko scp 
    python.exe -m pip install --upgrade pip
    
  2. 运行测试:右键loan.py,运行。
    在这里插入图片描述

  3. 在终端中运行

    pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple/
    pyinstaller -F -w src\loan.py
    

    loan.py是python 代码文件,pyinstaller -F -w src\loan.py编译成二进制文件

  4. 项目目录D:\PycharmProjects\pythonProject的dist目录下生成loan.exe,双击可以直接运行
    在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐