[Python] (Flet python) Complicação com TextField e aplicação de máscara com on_change

Discussão em 'Python' iniciado por Stack, Dezembro 18, 2024.

  1. Stack

    Stack Membro Participativo

    Estou fazendo um programa que tem tela de cadastro e tals, e no campo de CNPJ, optei por colocar uma máscara dinâmica, de modo que ela seja aplicada enquanto a pessoa digita o CNPJ dela, porém, quando executei o código, quando eu fui digitar o meu CNPJ, o início da máscara começou a ser aplicada, e isso fez com que todo o campo fosse selecionado, o que não acontecia antes de colocar a view=WEB_BROWSER, como posso resolver isso, deixando a view=WEB_BROWSER?

    from itertools import cycle
    import mysql.connector

    mydb = mysql.connector.connect(
    host="127.0.0.1",
    user="root",
    port=3306,
    password="password",
    database="database1"
    )
    cursor = mydb.cursor()

    def limpar_campo(e):
    e.control.error_text = ""
    e.control.update()

    def cnpj_exists(var_cnpj):
    # conexao_mysql = criar_conexao()
    # cursor = conexao_mysql.cursor()
    try:
    cursor.execute("SELECT cnpj from database1 WHERE cnpj = %s", (var_cnpj,))
    resultado = cursor.fetchone()

    if resultado:
    return True # Email existe
    else:
    return False # Email não existe
    except mysql.connector.Error as error:
    print("Erro ao consultar o banco de dados:", error)

    LENGTH_CNPJ = 14
    def is_cnpj_valido(cnpj: str) -> bool:
    if len(cnpj) != LENGTH_CNPJ:
    print("False 1 ")
    return False

    if cnpj in (c * LENGTH_CNPJ for c in "1234567890"):
    print("False 2")
    return False

    cnpj_r = cnpj[::-1]
    for i in range(2, 0, -1):
    cnpj_enum = zip(cycle(range(2, 10)), cnpj_r[i:])
    dv = sum(map(lambda x: int(x[1]) * x[0], cnpj_enum)) * 10 % 11
    if cnpj_r[i - 1:i] != str(dv % 10):
    print("False 3")
    return False
    print("True")
    return True

    def desmarcarar_cnpj(cnpj):
    parte_1 = cnpj[0:2]
    parte_2 = cnpj[3:6]
    parte_3 = cnpj[7:10]
    parte_4 = cnpj[11:15]
    parte_5 = cnpj[16:19]
    resultado = parte_1 + parte_2 + parte_3 + parte_4 + parte_5
    return resultado

    def verificar_cnpj(e):
    cnpj_valido = None
    cnpj_value = desmarcarar_cnpj(e.control.value)
    if not is_cnpj_valido(cnpj_value):
    e.control.error_text = "CNPJ inválido!" # Exibe a mensagem de erros
    cnpj_valido = False
    else:
    e.control.error_text = None # Limpa a mensagem de erro se o CNPJ for válido
    cnpj_valido = True
    # IF para conferir de o CNPJ existe ou não
    if cnpj_valido == True:
    if not cnpj_exists(cnpj_value) == True:
    e.control.error_text = None # Limpa a mensagem de erro se o CNPJ for válido
    else:
    e.control.error_text = "CNPJ já existe!"
    e.page.update()

    def formatar_cnpj(valor):
    """Formata o CNPJ no padrão 99.999.999/9999-99."""
    apenas_numeros = ''.join(filter(str.isdigit, valor)) # Remove caracteres não numéricos
    apenas_numeros = apenas_numeros[:14] # Limita o CNPJ a 14 dígitos

    parte_1 = apenas_numeros[0:2]
    parte_2 = apenas_numeros[2:5]
    parte_3 = apenas_numeros[5:8]
    parte_4 = apenas_numeros[8:12]
    parte_5 = apenas_numeros[12:14]

    if len(apenas_numeros) >= 13:
    return parte_1+'.'+parte_2+'.'+parte_3+'/'+parte_4+'.'+parte_5
    if len(apenas_numeros) >=9:
    return parte_1+'.'+parte_2+'.'+parte_3+'/'+parte_4
    if len(apenas_numeros) >=6:
    return parte_1+'.'+parte_2+'.'+parte_3
    if len(apenas_numeros) >=3:
    return parte_1+'.'+parte_2
    if len(apenas_numeros) <=2:
    return apenas_numeros

    def atualizar_cnpj(e):
    valor_atual = e.control.value
    valor_formatado = formatar_cnpj(valor_atual)

    # Atualizar o campo somente se o valor mudou
    if valor_atual != valor_formatado:
    e.control.value = valor_formatado
    e.page.update()
    e.control.focus()

    def create_input_fields():
    cnpjtxt = TextField(label="CNPJ", on_focus=lambda e=Page:limpar_campo(e), on_change=atualizar_cnpj, on_blur=verificar_cnpj)

    return cnpjtxt
    def empresa(page):
    page.theme_mode = ThemeMode.LIGHT
    cnpjtxt = create_input_fields()
    grid = Container(
    width=840,
    height=320,
    margin=10,
    padding=10,
    bgcolor=Colors.WHITE,
    border_radius=border_radius.all(15),
    shadow=BoxShadow(
    spread_radius=2,
    blur_radius=15,
    color=Colors.with_opacity(0.4, Colors.BLACK),
    offset=Offset(5, 5),
    ),
    alignment=alignment.center,
    content=Column(
    [
    Text(
    f"Cadastro de Empresa",
    weight=FontWeight.BOLD,
    size=20
    ),
    Row([cnpjtxt]),
    ],
    horizontal_alignment=CrossAxisAlignment.CENTER
    )
    )
    display = Container(
    content=Column(
    [
    grid,
    ],
    horizontal_alignment=CrossAxisAlignment.CENTER
    )
    )

    # page.add(display)

    # Executar o aplicativo
    page.add(display)

    app(target=empresa, view=WEB_BROWSER)```

    Continue reading...

Compartilhe esta Página