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
相关产品推荐
相关产品推荐

