You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter Pandas Python应用无法获取输入值完成WAC计算

问题诊断

你的代码点击计算后始终返回原始WAC,是4个核心问题导致的:

  • 筛选条件类型不匹配:预处理阶段你已经把SPECIAL_PROJ_CD列转为整数类型,但是计算函数里用字符串'3231'做匹配,pandas根本选不到对应行,利率替换逻辑完全没执行
  • 加权值未同步更新:Rate_WT列是初始化DataFrame时一次性计算的,替换LOAN_RATE后没有重新计算对应行的加权值,求和用的还是原始数据
  • 输入值类型处理错误:利率通常是带小数的数值(比如3%对应0.03),直接转int会丢失精度,同时没有做输入合法性校验,用户输入非数字内容会直接导致程序崩溃
  • 隐藏菜单函数存在变量名错误:函数内引用了不存在的c3231_frame_frame对象,调用时会直接抛异常
修复后完整代码
from tkinter import *
from tkinter import messagebox
import pandas as pd

root = Tk()
root.title("Financing Grid") 
root.geometry("600x600")

# 全局数据集初始化
df = pd.read_excel("C:\\Users\\mhorv656\\Documents\\Financing Grid v4.xlsx", "Data",
    engine = 'openpyxl', usecols = ['ORIG_AMT', 'LOAN_RATE', 'SPECIAL_PROJ_CD'])

df['ORIG_AMT'] = df['ORIG_AMT'].fillna(0).astype(int)
df['SPECIAL_PROJ_CD'] = df['SPECIAL_PROJ_CD'].fillna(0).astype(int)
df["Rate_WT"] = df["ORIG_AMT"] * df["LOAN_RATE"]


def c3231_code():
    c3231_frame.pack(fill = "both", expand = 1)
    global c3231_input, c3231_label
    # 利率输入框
    c3231_input = Entry(c3231_frame)
    c3231_input.pack(pady = 5)
    # 计算按钮
    c3231_button = Button(c3231_frame, text = "Calculate WAC", command = c3231_wac)
    c3231_button.pack(pady = 5)
    # 提示标签
    c3231_label = Label(c3231_frame, text = "Enter Rate Above")
    c3231_label.pack(pady = 5)


def c3231_wac():
    try:
        # 读取输入值,转float支持小数利率
        new_rate = float(c3231_input.get())
    except ValueError:
        messagebox.showerror("输入错误", "请输入合法的数字利率")
        c3231_input.delete(0, 'end')
        return
    
    # 匹配3231项目行(用整数3231匹配,和列类型一致)
    match_mask = df['SPECIAL_PROJ_CD'] == 3231
    # 更新对应行的贷款利率
    df.loc[match_mask, 'LOAN_RATE'] = new_rate
    # 同步更新对应行的加权利率值
    df.loc[match_mask, 'Rate_WT'] = df.loc[match_mask, 'ORIG_AMT'] * new_rate
    
    # 计算新WAC
    WAC = df["Rate_WT"].sum() / df["ORIG_AMT"].sum()
    # 展示结果,保留4位小数方便阅读
    c3231_label.config(text = f"当前WAC为: {WAC:.4f}")
    # 清空输入框
    c3231_input.delete(0, 'end')


# 帧切换隐藏函数
def hide_menu_frames():
    for widget in c3231_frame.winfo_children():
        widget.destroy()
    c3231_frame.pack_forget()
    start_frame.pack_forget()

# 初始化帧
c3231_frame = Frame(root, width = 400, height = 400)
start_frame = Frame(root, width = 400, height = 400)

# 首页
def home():
    start_frame.pack(fill = "both", expand = 1)
    Label(start_frame, text = "Performing WAC Calculation", font = ("Helvetica", 18)).pack(pady = 40) 

# 首页跳转按钮
Button(start_frame, text = "Enter Rate for 3231", command = c3231_code).pack(pady = 5)

# 菜单栏
my_menu = Menu(root)
root.config(menu = my_menu)
app_menu = Menu(my_menu)
my_menu.add_cascade(label = "Finance Grid", menu = app_menu)
app_menu.add_separator()
app_menu.add_command(label = "Exit", command = root.quit)

# 加载首页
home()
root.mainloop()
关键修改点
  • 把筛选条件里的字符串'3231'改成整数3231,和列数据类型匹配,能正确定位到需要修改利率的行
  • 每次更新利率后,同步更新对应行的Rate_WT值,保证加权求和用的是最新数据
  • 输入值转float支持小数利率,增加异常捕获做输入校验,避免非法输入导致程序崩溃
  • 修正了隐藏帧函数里的错误变量名,避免调用时报错
  • 结果展示复用原有标签更新文本,不会每次点击计算都新增标签堆在界面上

内容的提问来源于stack exchange,提问作者Matthew_H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 21:09:25