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

Python Flet中DataTable删除数据报错TypeError问题求助

解决Flet DataTable删除数据时的TypeError问题

使用Flet框架开发CRUD应用,数据新增功能运行正常,但点击IconButton删除DataTable中的数据时,触发错误提示:

TypeError: list indices must be integers or slices, not str

错误原因

原eliminar函数存在两处核心问题:

  • 错误尝试移除整个rows列表而非目标数据行:tablaproducto.rows.remove(tablaproducto.rows)
  • 未关联点击按钮对应的具体数据行,无法定位要删除的记录

修正方案

  1. 在新增数据时,给删除按钮的data属性绑定当前创建的DataRow,让点击事件直接获取目标行
  2. 修改eliminar函数,通过事件对象取出绑定的DataRow,再从表格的rows列表中移除

完整修正代码

import flet as ft
from flet import *


def main(page: ft.Page):
    codpro = TextField(label="CÓDIGO PRODUCTO")
    nompro = TextField(label="NOMBRE PRODUCTO")

    # 品类下拉框
    ddcate = ft.Dropdown(
        label="CATEGORIA",
        width=150,
        options=[
            ft.dropdown.Option("dulce"),
            ft.dropdown.Option("salado"),
        ],
    )

    # 重量单位下拉框
    ddpeso = ft.Dropdown(
        label="PESO",
        width=100,
        options=[
            ft.dropdown.Option("KG"),
            ft.dropdown.Option("G"),
        ],
    )

    tablaproducto = DataTable(
        # 列标题
        columns=[
            DataColumn(Text("CÓDIGO")),
            DataColumn(Text("PRODUCTO")),
            DataColumn(Text("CATEGORÍA")),
            DataColumn(Text("PESO")),
            DataColumn(Text("ACCIONES")),
        ],
        # 数据行
        rows=[]
    )

    # 删除函数
    def eliminar(e):
        # 从事件对象中获取绑定的DataRow
        row_to_delete = e.control.data
        tablaproducto.rows.remove(row_to_delete)

        # 底部提示条
        page.snack_bar = SnackBar(
            Text("SE ELIMINO DATO", size=30),
            bgcolor="red"
        )
        page.snack_bar.open = True
        page.update()

    # 新增函数
    def agregar(e):
        # 创建当前数据行
        new_row = DataRow(
            cells=[
                DataCell(Text(codpro.value)),
                DataCell(Text(nompro.value)),
                DataCell(Text(ddcate.value)),
                DataCell(Text(ddpeso.value)),
                DataCell(
                    Row([
                        IconButton(
                            "delete",
                            icon_color="red",
                            on_click=eliminar,
                            data=new_row  # 绑定当前行到按钮的data属性
                        ),
                    ])
                ),
            ]
        )
        tablaproducto.rows.append(new_row)

        # 底部提示条
        page.snack_bar = SnackBar(
            Text("DATO INGRESADO CORRECTAMENTE", size=30),
            bgcolor="green"
        )
        page.snack_bar.open = True
        page.update()

    # 新增按钮
    BtnAgregar = ElevatedButton(
        text="Agregar",
        bgcolor="blue",
        color="white",
        on_click=agregar
    )

    page.add(
        Column([
            Text("PRODUCTOS", size=30, weight="bold"),
            codpro, nompro, ddcate, ddpeso,
            Row([BtnAgregar]),
            tablaproducto
        ])
    )


ft.app(target=main)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:26:05