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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:25:22