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.')