[Python] Problemas com dialog no Flet

Discussão em 'Python' iniciado por Stack, Julho 31, 2025.

  1. Stack

    Stack Membro Participativo

    Estou fazendo um pequeno app em FLET para aprender (seguindo um tutorial), porém, ao tentar fazer um dialog de confirmação para exclusão, o mesmo não aparece quando clico no botão de excluir.

    Alguém tem alguma ideia?

    import flet as ft
    from controller.produto_controller import ProdutoController

    def produto_list_view(page):
    lista_produtos = ft.Column(expand=True, scroll=ft.ScrollMode.AUTO)

    # Variável para armazenar o ID do produto a ser excluído
    id_produto_excluir = None

    # Função para mostrar o diálogo de confirmação
    def show_delete_dialog(id_produto):
    nonlocal id_produto_excluir
    id_produto_excluir = id_produto

    # Cria o diálogo
    dialog = ft.AlertDialog(
    modal=True,
    title=ft.Text("Confirmação"),
    content=ft.Text(f"Deseja realmente excluir o produto {id_produto}?"),
    actions=[
    ft.TextButton("Sim", on_click=confirmar_exclusao),
    ft.TextButton("Cancelar", on_click=fechar_dialogo),
    ],
    )

    # Mostra o diálogo
    page.dialog = dialog
    dialog.open = True
    page.update()

    def confirmar_exclusao(e):
    nonlocal id_produto_excluir
    fechar_dialogo()

    if id_produto_excluir and ProdutoController.excluir_produto(id_produto_excluir):
    carregar_produtos()
    page.snack_bar = ft.SnackBar(ft.Text("Produto excluído com sucesso!"))
    page.snack_bar.open = True
    else:
    page.snack_bar = ft.SnackBar(ft.Text("Erro ao excluir produto!"))
    page.snack_bar.open = True

    page.update()
    id_produto_excluir = None

    def fechar_dialogo(e=None):
    if page.dialog:
    page.dialog.open = False
    page.update()

    def carregar_produtos():
    produtos = ProdutoController.listar_produtos()
    lista_produtos.controls.clear()

    for produto in produtos:
    lista_produtos.controls.append(
    ft.Card(
    content=ft.Container(
    content=ft.Column([
    ft.ListTile(
    leading=ft.Image(src_base64=produto['imagem'], width=50, height=50) if produto['imagem'] else ft.Icon(ft.icons.INVENTORY),
    title=ft.Text(produto['nome']),
    subtitle=ft.Text(f"R$ {produto['preco']:.2f}"),
    trailing=ft.PopupMenuButton(
    icon=ft.icons.MORE_VERT,
    items=[
    ft.PopupMenuItem(icon=ft.icons.EDIT, text="Editar",
    on_click=lambda e, id=produto['id']: editar_produto(id)),
    ft.PopupMenuItem(icon=ft.icons.DELETE, text="Excluir",
    on_click=lambda e, id=produto['id']: show_delete_dialog(id)),
    ]
    )
    ),
    ft.Divider(height=1)
    ]),
    padding=10,
    ),
    elevation=5,
    margin=ft.margin.only(bottom=10)
    )
    )
    page.update()

    def editar_produto(id):
    page.route = f"/produto/{id}"
    page.update()

    def novo_produto(e):
    page.route = "/produto/novo"
    page.update()

    carregar_produtos()

    return ft.View(
    route="/",
    controls=[
    ft.AppBar(
    title=ft.Text("Produtos"),
    center_title=True,
    bgcolor=ft.colors.BLUE_700,
    actions=[
    ft.IconButton(icon=ft.icons.ADD, on_click=novo_produto)
    ]
    ),
    ft.Container(
    content=lista_produtos,
    padding=20,
    expand=True
    )
    ]
    )

    Continue reading...

Compartilhe esta Página