Tkinter Treeview价格列值累加失败问题排查
Tkinter Treeview价格列累加报错排查与解决
问题说明
使用Tkinter的Treeview组件实现商品添加后实时累加价格列数值时,无法完成累加,触发ValueError:无法将带€符号的字符串转换为整数。
相关代码片段
def Cesta(self): self.conex() self.b_codigo = self.s_Codigo.get() self.sql3 = "SELECT * FROM productos WHERE codigo = %s" self.mycursor.execute(self.sql3,[(self.b_codigo)]) self.r_codigo = self.mycursor.fetchall() self.row3 = [item['nombre'] for item in self.r_codigo] if self.s_Codigo.get() == "": MessageBox.showinfo("ERROR", "DEBES INTRODUCIR DATOS", icon="error") elif self.r_codigo: for self.x2 in self.r_codigo: print (self.x2["nombre"], self.x2["talla"], self.x2["precio"]+"€") self.tree.insert('', 'end', text=self.x2["nombre"], values=(self.x2["talla"],self.x2["precio"]+" €")) print(self.x2["fecha"]) for self.item in self.tree.get_children(): self.resultado = 0 self.celda = int(self.tree.set(self.item,"col2")) self.total = int(self.resultado) + int(float(self.celda)) print(self.total) else: MessageBox.showinfo("ERROR", "EL CODIGO INTRODUCIDO NO ES CORRECTO", icon="error") self.clear_entry()
报错信息
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/tkinter/__init__.py", line 1921, in __call__ return self.func(*args) File "/Users/tomas/Downloads/PROYECTO/main.py", line 205, in Cesta self.celda = int(self.tree.set(self.item,"col2")) ValueError: invalid literal for int() with base 10: '134,99 €' [Finished in 6.7s]
Treeview配置
self.tree = ttk.Treeview(self.pagina1,columns=("col1","col2"), height=50) self.tree.grid(column=0, row=2, padx=50, pady=100) ### COLUMNAS ### self.tree.column("#0",width=250) self.tree.column("col1",width=150, anchor=CENTER) self.tree.column("col2",width=150, anchor=CENTER) ### NOMBRES COLUMNAS ### self.tree.heading("#0", text="Articulo", anchor=CENTER) self.tree.heading("col1", text="Talla", anchor=CENTER) self.tree.heading("col2", text="Precio", anchor=CENTER)
错误原因与修复方案
1. 字符串转数值失败
Treeview的col2列存储的是带€符号、空格和逗号小数分隔符的字符串(如'134,99 €'),直接转换整数/浮点数会报错。需要先清理字符串:
- 移除€符号和空格
- 将逗号替换为点号(适配Python的浮点数格式)
2. 累加逻辑错误
原代码中每次循环都将self.resultado重置为0,导致无法累计总和,需将初始化语句移到循环外部。
修改后的累加代码片段
elif self.r_codigo: for self.x2 in self.r_codigo: print (self.x2["nombre"], self.x2["talla"], self.x2["precio"]+"€") self.tree.insert('', 'end', text=self.x2["nombre"], values=(self.x2["talla"],self.x2["precio"]+" €")) print(self.x2["fecha"]) # 初始化总和为0,放在循环外 self.resultado = 0.0 for self.item in self.tree.get_children(): # 获取价格字符串并清理格式 precio_str = self.tree.set(self.item,"col2") precio_clean = precio_str.replace('€', '').strip().replace(',', '.') # 转换为浮点数并累加 self.resultado += float(precio_clean) # 输出或使用累加结果,可按需格式化 self.total = self.resultado print(f"Total: {self.total:.2f} €")
优化建议(可选)
插入Treeview时,可将原始数值存储在内部,仅在显示时格式化带€符号,这样后续计算更便捷:
# 插入时存储原始数值 self.tree.insert('', 'end', text=self.x2["nombre"], values=(self.x2["talla"], self.x2["precio"])) # 自定义Treeview显示格式,通过tag配置实现带€的显示效果 self.tree.tag_configure('precio_tag', font=('Arial', 10)) # 插入时绑定tag,后续可通过绑定事件动态格式化显示 self.tree.insert('', 'end', text=self.x2["nombre"], values=(self.x2["talla"], self.x2["precio"]), tags=('precio_tag',))
内容的提问来源于stack exchange,提问作者Tomas
相关产品推荐
相关产品推荐

