Tkinter Treeview增删行时总额计算异常问题求助
问题原因
删除行后总额计算错误的核心问题是:buying_deletecheck方法里计算总和前没有重置self.buying_totalchecks为0。而buying_addcheck每次计算前都会重置这个变量,所以添加行时计算正常,但删除行时会在之前的总和基础上继续累加剩余行的值,导致结果完全错误。
修复方案
1. 直接修复删除方法
在删除行后的循环计算前,先把总和变量重置为0:
def buying_deletecheck(self): # CODE FOR SUBSTRACT VALUES# self.con = sqlite3.connect('car dealership.db') self.cursorObj = self.con.cursor() self.buying_selected_item_deletecheck = self.buying_checkspaymenttree.selection()[0] uid = self.buying_checkspaymenttree.item(self.buying_selected_item_deletecheck)['values'][3] self.cursorObj.execute("DELETE FROM cars_buying_checks WHERE id=?", (uid,)) self.con.commit() self.rowid -= 1 self.buying_checkspaymenttree.delete(self.buying_selected_item_deletecheck) # 关键:重置总和变量为0,避免累加旧值 self.buying_totalchecks = 0 for child in self.buying_checkspaymenttree.get_children(): self.buying_totalchecks += int(self.buying_checkspaymenttree.item(child)["values"][1]) self.subtraction = int(self.pricevar.get()) - self.buying_totalchecks self.carprice_Verif_l.config(text=f"{self.pricevar.get()}: PRICE") self.checks_Verif_l.config(text=f"{self.buying_totalchecks}: TOTAL") self.checks_subtraction_l.config(text=f"{self.subtraction}: REAMINING")
2. 优化代码(推荐)
把计算总和、更新UI的逻辑抽成独立方法,避免重复代码,后续添加、删除操作都调用这个方法,减少出错概率:
def update_check_total(self): # 重置总和并重新计算所有行的值 self.buying_totalchecks = 0 for child in self.buying_checkspaymenttree.get_children(): self.buying_totalchecks += int(self.buying_checkspaymenttree.item(child)["values"][1]) # 统一更新UI显示 self.subtraction = int(self.pricevar.get()) - self.buying_totalchecks self.carprice_Verif_l.config(text=f"{self.pricevar.get()}: PRICE") self.checks_Verif_l.config(text=f"{self.buying_totalchecks}: TOTAL") self.checks_subtraction_l.config(text=f"{self.subtraction}: REAMINING") # 修改添加方法 def buying_addcheck(self): # UNESSESRY CODE# # ... 你的添加行逻辑 ... # 调用统一的更新方法 self.update_check_total() # 修改删除方法 def buying_deletecheck(self): # CODE FOR SUBSTRACT VALUES# self.con = sqlite3.connect('car dealership.db') self.cursorObj = self.con.cursor() self.buying_selected_item_deletecheck = self.buying_checkspaymenttree.selection()[0] uid = self.buying_checkspaymenttree.item(self.buying_selected_item_deletecheck)['values'][3] self.cursorObj.execute("DELETE FROM cars_buying_checks WHERE id=?", (uid,)) self.con.commit() self.rowid -= 1 self.buying_checkspaymenttree.delete(self.buying_selected_item_deletecheck) # 调用统一的更新方法 self.update_check_total()
这样既解决了当前的计算错误问题,还让代码更简洁易维护,后续如果要调整UI显示逻辑,只需要修改update_check_total一个方法即可。
内容的提问来源于stack exchange,提问作者asaad kittaneh
相关产品推荐
相关产品推荐

