Kivy progress Bar update with upload blob function

12 Views Asked by At

i'm trying to make a progress bar that reflect my upload progress but when i call my upload function the clock.schedule_interval stop to run and just run the upload process and when upload process run out my clock.scedule_interval run and the progress bar fill up, i tested using thread but didn't work, i'm related new in kivy so any hints?

here my class code

class PopupProgressBar(Widget):
    progress_bar = ObjectProperty()

    def __init__(self, **kwargs):
        super(PopupProgressBar, self).__init__(**kwargs)
        self.progress_bar = ProgressBar()
        self.popup = Popup(title='Enviando Items...', content=self.progress_bar)
        self.popup.bind(on_open=self.puopen)
        self.current_progress = 0
        self.current_size = 0
        Clock.schedule_once(self.progress_bar_start)

    def progress_bar_start(self, instance):
        self.progress_bar.value = 0
        self.popup.open()

    def progressBar_update(self, dt):
        if self.progress_bar.value >= self.progress_bar.max:
            return False
        self.progress_bar.value += self.current_progress
        print(self.progress_bar.value)
        self.progress_bar.max = self.current_size
        print(self.progress_bar.max)

    def puopen(self, instance):
        
        self.upload()
        
    def upload(self):
        Clock.schedule_once(self.progressBar_update, .1)
        flag = False
        for dir in MyAPP_Transf.selected_checkboxes:
            try:
                self.upload_blob_transfer_options(container_name='biotech-camp-teste', connection_string=connection_string, 
                                            directory=dir, blob_service_client=blob_service_client)
            except FileExistsError as e:
                flag = True
                print(f'erro: {e}')
                print(type(e))
                popup_fail = SuccesPopUp(text_succes='O diretório já existe')
                popup_fail.open()
            if len(MyAPP_Transf.selected_checkboxes) != 0 and flag != True:
                popup_succes = SuccesPopUp(text_succes='Upload realizado com sucesso')
                popup_succes.open()
           

    def upload_blob_transfer_options(self, **kwargs):
        def update_progress(current,total):
            print(self.current_progress)
            self.current_progress = current/(1024*1024)
            

        global tamanho_arquivo, total_progress
        total_progress = 0
        tamanho_arquivo = 0
        if os.path.isdir(kwargs.get('directory')):
            # Obtem se o container biotech-camp-test
            container_client = blob_service_client.get_container_client(kwargs.get('container_name'))
            # Obtem o nome do diretorio pai atraves da segmentacao do path fornecido
            # seguindo a entrutura da azure para indicar que o arquivo a ser criado e 
            # um diretorio adciona se a / no final do nome
            folder_name = kwargs.get('directory').split('/')[-1] + "/"
            tamanho_arquivo = blob_function.tamanho_diretorio(kwargs.get('directory'))/(1024*1024)
            self.current_size = tamanho_arquivo
            # Itera sobre os diretorios e arquivos no caminho fornecido
            for root, dirs, files in os.walk(kwargs.get('directory')):
                # Itera sobre os arquivo no diretório corrente
                for file_name in files:
                    # Constroi o caminho completo para o arquivo
                    local_path = os.path.join(root, file_name)
                    # Calcula o caminho relativo do arquivo em relacao ao diretorio principal
                    relative_path = os.path.relpath(local_path, kwargs.get('directory'))
                    # Constroi o nome do blob no Azure Blob Storage
                    blob_name = folder_name + relative_path
                    # Obtem o cliente do blob para o blob especifico, não necessariamente esse blob
                    # precisa existir
                    blob_client = container_client.get_blob_client(blob_name)
                    try:
                        print('A transferência para azure foi iniciada...')
                        print('Aquivo: ',file_name)
                        # Abre o arquivo local em modo de leitura binaria
                        with open(local_path, "rb") as data:
                            # Carrega o arquivo para o blob no azure, definindo o tipo de conteudo como application/octet-stream
                            # indicando que os dados que vão ser enviados são uma sequencia arbitraria de bytes sem uma intepretacao
                            # especifica
                            # pass
                            blob_client.upload_blob(data, content_settings=ContentSettings(content_type="application/octet-stream"),
                                                                max_concurrency=2, overwrite= True, 
                                                                progress_hook = update_progress)                   
                    # Trata as excecoes caso occora durante a trasnferencia
                    except Exception as ex:
                        print('Exception: ')
                        print(ex)
                    
            print('A transferência foi concluída.')
            
        else:
            blob_name = kwargs.get('directory').split('/')[-1]
            print(blob_name)
            tamanho_arquivo = blob_function.tamanho_diretorio(kwargs.get('directory'))/(1024*1024)
            self.current_size = tamanho_arquivo
            # Constroi se um Blob Client com opcoes de transferencia
            # Nesse caso, se o arquivo tiver o tamanho maximo de 64 Mb
            # ele e enviado de uma vez só, caso contrario sera enviado em partes
            # sendo 4 Mb por vez
            blob_client = BlobClient.from_connection_string(
                conn_str=connection_string, 
                container_name=kwargs.get('container_name'), 
                blob_name=blob_name,
                # max_block_size=1024*1024*4, # 4 MiB
                # max_single_put_size=1024*1024*2000 # 64 MiB
            )
            try:
                print('A transferência para azure foi iniciada...')
                # Abre o arquivo local em modo leitura binaria 
                with open(file=kwargs.get('directory'), mode="rb") as data:
                    # Faz o uploado do arquivo setando no maximo 2 operação paralelas
                    blob_client.upload_blob(data=data, overwrite=True, max_concurrency=2, progress_hook = update_progress)
                
            # Trata as excecoes caso ocorra durante a transferencia dos arquivos
            except Exception as ex:
                print('Exception: ')
                print(ex)
            print('A trasferência foi concluída.')

0

There are 0 best solutions below