IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GUI Python Discussion :

Mettre à jour une barre de progression d'upload


Sujet :

GUI Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Technicien audiovisuel
    Inscrit en
    Juillet 2023
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Technicien audiovisuel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2023
    Messages : 11
    Par défaut Mettre à jour une barre de progression d'upload
    Bonjour j'essaie depuis plusieurs jours de faire fonctionner une barre de progression pour suivre l'upload de fichiers sur un bucket S3 mais à chaque tentative que je fait python plante et je suis obligé d'aller dans le gestionnaire des tâches pour régler le soucis. Je me suis tourné vers les threads mais je suis un novice sur ce thème.
    Merci d'avance pour le retour.

    Ci-joint mon code.

    from tkinter import *
    from tkinter import ttk
    from tkinter import filedialog
    import sys
    import os
    import boto3
    import threading

    root = Tk()
    root.geometry("1000x400")

    dict_value = {'chemin': 'filename'}



    def update (valeur):
    label_percent.insert(END, valeur)

    def choix_file():
    chemin = filedialog.askopenfilename(initialdir='C:/Users/caudo/Videos/', title="Select File",
    filetypes=[("All files", "*")], typevariable=StringVar)
    labels_chf.configure(text=f'Fichier a traiter : {chemin}')
    dict_value['chemin'] = (chemin)


    def upload():
    def update_progress(percentage):
    my_progress['value'] = percentage

    s3 = boto3.client(
    service_name='s3',
    aws_access_key_id='AKIAYZGTB4U45F25VHP3',
    aws_secret_access_key='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',
    )

    class ProgressPercentage(object):

    def __init__(self, filename):
    self._filename = filename
    self._size = float(os.path.getsize(filename))
    self._seen_so_far = 0
    self._lock = threading.Lock()

    def __call__(self, bytes_amount):
    # To simplify, assume this is hooked up to a single filename
    with self._lock:
    self._seen_so_far += bytes_amount
    percentage = (self._seen_so_far / self._size) * 100
    #sys.stdout.write(
    # "\r%s %s / %s (%.2f%%)" % (
    # self._filename, self._seen_so_far, self._size,
    # percentage))
    #sys.stdout.flush()
    thread2 = threading.Thread(target=update, args=(percentage))
    thread2.start()
    thread2.join()


    new_filename = chemin = os.path.basename(dict_value['chemin'])
    s3.upload_file(
    dict_value['chemin'], 'testbein', f'video/{new_filename}',
    Callback=ProgressPercentage(dict_value['chemin'])
    )

    # Thread



    # Boutton
    b_file = ttk.Button(root, text="Choose file", command=choix_file)
    b_file.place(x=450, y=10)

    b_upload = ttk.Button(root, text="Upload file", command=upload)
    b_upload.place(x=450, y=200)

    # Label
    labels_chf = Label(root, bd=3, text='Fichier a traiter : ', font='Arial 12 bold') # -> Texte + Police
    labels_chf.place(x=200, y=50) # -> Position label

    label_percent = Text(root, width=30, height=3, background='red')
    label_percent.place(x=200, y=190)

    my_progress = ttk.Progressbar(root, orient=HORIZONTAL, length=300, mode="determinate")
    my_progress.place(x=330, y=150)

    root.mainloop()

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 790
    Par défaut
    Salut,

    C'est de la programmation tkinter un peu avancée.
    Techniquement on peut écrire quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import tkinter as tk
    import tkinter.ttk as ttk
    import time
     
    from threading import  Thread
     
    def update(callback):
        value = 0
        while value < 100:
              callback(value)
              value += 10
              time.sleep(0.1)
     
    def do_start():
        def do_it(root, variable):
            def inner(value):
                root.after_idle(variable.set, value)
            return inner
     
        z = Thread(target=update, args=(do_it(root, pb_var),))
        z.daemon=True
        z.start()
     
     
    root = tk.Tk()
     
    tk.Button(root, text='start', command=do_start).pack()
    pb_var = tk.IntVar(value=0)
    pb = ttk.Progressbar(root, orient='horizontal', length=300, 
                        mode="determinate",
                        variable=pb_var)
    pb.pack()
    tk.mainloop()
    Après il faut comprendre les ingrédients de cette mécanique pour l'adapter à ses besoins.
    note: c'est l'instruction z.daemon = True qui fait qu'en cas de plantage, le thread sort sans avoir à tuer le process.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre habitué
    Homme Profil pro
    Technicien audiovisuel
    Inscrit en
    Juillet 2023
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Technicien audiovisuel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2023
    Messages : 11
    Par défaut
    Merci pour ta réponse j'essaie ça au plus vite

  4. #4
    Membre habitué
    Homme Profil pro
    Technicien audiovisuel
    Inscrit en
    Juillet 2023
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Technicien audiovisuel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2023
    Messages : 11
    Par défaut
    Bonjour j'ai mis à jour mon code avec le tien mais j'ai une erreur et je ne vois pas d'où elle peut venir.

    Exception in thread Thread-1 (update):
    Traceback (most recent call last):
    File "C:\Users\caudo\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner
    self.run()
    File "C:\Users\caudo\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
    File "C:\Users\caudo\OneDrive\Documents\IXI\Projet_IXI\FTP_UPLOAD\code\test_progressbar2.py", line 20, in update
    callback(value)
    TypeError: 'NoneType' object is not callable
    Exception in thread Thread-2 (update):
    Traceback (most recent call last):
    File "C:\Users\caudo\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner
    self.run()
    File "C:\Users\caudo\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
    File "C:\Users\caudo\OneDrive\Documents\IXI\Projet_IXI\FTP_UPLOAD\code\test_progressbar2.py", line 20, in update
    callback(value)
    TypeError: 'NoneType' object is not callable








    from tkinter import *
    from tkinter import ttk
    from tkinter import filedialog
    import os
    import boto3
    import threading
    from threading import Thread
    import time

    root = Tk()
    root.geometry("1000x400")

    dict_value = {'chemin': 'filename','percentage': 0}

    pb_var = IntVar(value=0)

    def update(callback,avancement):
    value = 0
    while value < 100:
    callback(value)
    value += avancement
    time.sleep(0.1)



    def choix_file():
    chemin = filedialog.askopenfilename(initialdir='C:/Users/caudo/Videos/', title="Select File",
    filetypes=[("All files", "*")], typevariable=StringVar)
    labels_chf.configure(text=f'Fichier a traiter : {chemin}')
    dict_value['chemin'] = (chemin)


    def upload():
    def update_progress(percentage):
    my_progress['value'] = percentage

    s3 = boto3.client(
    service_name='s3',
    aws_access_key_id='AKIAYZGTB4U45F25VHP3',
    aws_secret_access_key='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',
    )

    class ProgressPercentage(object):

    def __init__(self, filename):
    self._filename = filename
    self._size = float(os.path.getsize(filename))
    self._seen_so_far = 0
    self._lock = threading.Lock()

    def __call__(self, bytes_amount):
    # To simplify, assume this is hooked up to a single filename
    with self._lock:
    self._seen_so_far += bytes_amount
    percentage = (self._seen_so_far / self._size) * 100
    dict_value['percentage']= (percentage)
    #sys.stdout.write(
    # "\r%s %s / %s (%.2f%%)" % (
    # self._filename, self._seen_so_far, self._size,
    # percentage))
    #sys.stdout.flush()

    def do_start():
    def do_it(root, variable,avancement):
    def inner(value):
    root.after_idle(variable.set, value+avancement)
    return inner

    z = Thread(target=update, args=(do_it(root, pb_var,dict_value['percentage']), dict_value['percentage']))
    z.daemon=True
    z.start()

    do_start()


    new_filename = chemin = os.path.basename(dict_value['chemin'])
    s3.upload_file(
    dict_value['chemin'], 'testbein', f'video/{new_filename}',
    Callback=ProgressPercentage(dict_value['chemin'])
    )

    # Thread



    # Boutton
    b_file = ttk.Button(root, text="Choose file", command=choix_file)
    b_file.place(x=450, y=10)

    b_upload = ttk.Button(root, text="Upload file", command=upload)
    b_upload.place(x=450, y=200)

    # Label
    labels_chf = Label(root, bd=3, text='Fichier a traiter : ', font='Arial 12 bold') # -> Texte + Police
    labels_chf.place(x=200, y=50) # -> Position label

    label_percent = Text(root, width=30, height=3, background='red')
    label_percent.place(x=200, y=190)

    my_progress = ttk.Progressbar(root, orient=HORIZONTAL, length=300, mode="determinate")
    my_progress.place(x=330, y=150)

    root.mainloop()

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 790
    Par défaut
    Si callback est None, c'est que do_it n'a pas retourné inner. Ce qui peut être du à l'indentation mais pas facile à déterminer vu que vous n'avez pas posté le code dans les balises adhoc pour puisse les voir.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre habitué
    Homme Profil pro
    Technicien audiovisuel
    Inscrit en
    Juillet 2023
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Technicien audiovisuel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2023
    Messages : 11
    Par défaut
    Heu je ne sais ce que sont les balises adhoc ...

Discussions similaires

  1. [Qt Designer] Mettre une barre de progression dans une QTableWidget
    Par bombseb dans le forum Outils
    Réponses: 0
    Dernier message: 16/11/2018, 17h33
  2. [PHP 7] Upload avec une barre de progression
    Par Fredy007 dans le forum Langage
    Réponses: 6
    Dernier message: 03/01/2017, 16h55
  3. Réponses: 7
    Dernier message: 20/05/2016, 19h45
  4. Afficher une barre de progression en upload
    Par illuzmax dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/06/2006, 14h32
  5. Indy FTP (idFTP) faire une barre de progress de transfert
    Par Harry dans le forum Web & réseau
    Réponses: 4
    Dernier message: 09/07/2004, 14h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo