Jump to content

Como criar uma barra de progresso com função externa dentro de outra função com for iterando x vezes


Recommended Posts

Posted (edited)

Boa noite pessoal. Sou novo aqui e estou com uma encrenca.

Tenho uma situação onde tenho que adicionar uma barra de progresso executando intercalado com um loop dentro de uma função.

Nesta função com loop, tem chamada de outra função com API. Então ela recebe CNPJs e vi enviando uma por uma e dando insert no banco.

O meu problema é que não consigo encaixar o progress bar intercalado com o for. Se coloco dentro, cada passada no for, abre uma vez a barra de progresso.

Se colocar dentro da função, mas fora do for, ele ou faz a barra de progresso ou o insert separado. ( Não sincronizado )

Dentro da função do progress bar, tem um loop. então se entra, para de dar insert e fica ate acabar o progress bar. 

Existe alguma maneira de intercalar os dois processos ao mesmo tempo. O for rodando a qtd x de vezes que precisa e o progress bar executando até encerrar, contabilizando o tempo estimado de execução?

Threads, observando se clicou no evento do botão, variaveis globais são exemplos de tentativas.

Abaixo segue o progress bar:

def processar_itens(total_itens, tempo_medio_por_item)
    root = tk.Tk()
    root.geometry("300x150")
    root.title("Previsão de Término")
 
    # Cria a barra de progresso e o rótulo de previsão de término
    barra_progresso = ttk.Progressbar(root, orient=tk.HORIZONTAL, length=200, mode="determinate")
    lbl_previsao_termino = tk.Label(root, text="Previsão de término: ")
 
    # Posiciona os widgets na janela
    barra_progresso.pack(pady=10)
    lbl_previsao_termino.pack()
 
    for i in range(total_itens)
        # Simula o processamento de um item
        time.sleep(tempo_medio_por_item)
 
        # Calcula a taxa de progresso atual
        taxa_progresso = (i + 1) / total_itens
 
        # Calcula o tempo restante estimado em segundos
        tempo_restante_segundos = (total_itens - (i + 1)) * tempo_medio_por_item
 
        # Atualiza a barra de progresso e o rótulo de previsão de término
        barra_progresso["value"] = taxa_progresso * 100
        tempo_restante_str = time.strftime("%H:%M:%S", time.gmtime(tempo_restante_segundos))
        lbl_previsao_termino["text"] = f"Previsão de término: {tempo_restante_str}"
        root.update()
 
        #Em implementação - fechar janela de previsão, mas manter o programa rodando
        if tempo_restante_str == '00:00:00':
            root.destroy()

E abaixo e função que preciso invocar  o progress bar:

try:
    def importar_cli():
        for i in range(len(lista_sem_especiais)):
            em = lista_sem_especiais[i]
 
            res = re.sub('()!,*#%&+', '',str(funcao.consulta_cnpj(em)))
            res1 = re.sub('"','',str([res]))
 
            res2 = res1.replace('(','')
            res3 = res2.replace(')','')
 
            retornoGeral = res3.split(",")  #separa para lista quando separador é virgula
 
            cnpj = retornoGeral[0]
            cnpj2= cnpj.replace("[","")
            cnpj3= cnpj2.replace("'","")
 
            nome = retornoGeral[1]
            nome2= nome.replace("'","")
 
            logradouro = retornoGeral[2]
            logradouro2= logradouro.replace("'","")
 
            numero = retornoGeral[3]
            numero2= numero.replace("'","")
 
            complemento = retornoGeral[4]
            complemento2= complemento.replace("'","")
 
            bairro = retornoGeral[5]
            bairro2= bairro.replace("'","")
 
            municipio = retornoGeral[6]
            municipio2= municipio.replace("'","")
 
            uf = retornoGeral[7]
            uf2= uf.replace("'","")
 
            cep = retornoGeral[8]
            cep2= cep.replace("'","")
 
            telefone = retornoGeral[9]
            telefone2= telefone.replace("'","")
 
            email = retornoGeral[10]
            email2= email.replace("'","")
 
            email2 = email.replace("]","")
            email3 = email2.replace("'","")
 
            comando = f'insert into dados_importados(CNPJ,nome,logradouro,numero,complemento,bairro,municipio,uf_estado,cep,telefone,email) VALUES("{cnpj3}","{nome2}","{logradouro2}","{numero2}","{complemento2}","{bairro2}","{municipio2}","{uf2}","{cep2}","{telefone2}","{email3}")'
            print(' Chegamos após o insert')
            root.after(10, dados)
 
            BD_inst.cursor_BD.execute(comando)
            BD_inst.conexao.commit()
 
        num_elementos = len(lista_sem_especiais) #qtde de elementos da lista de CNPJ
        #processar_itens(num_elementos, 21)
 
        #t = threading.Thread(target=processar_itens(num_elementos,21))
        t = threading.Thread(target=processar_itens(num_elementos,21))
        t.start()
 
        #root.after(21, importar_cli)
 
           
except (None):
    #except precisa ser ajustado e incrementado para mais exceções
    messagebox.showinfo(title="Erro", message="erro com nome.")

 

Obrigado pela atenção.

 

 

Edited by jeferson.moller
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×
×
  • Create New...