Les sources des exemples sont disponibles ici.
Le principe
Lorsque l’application possède une action longue, il est important d’utiliser une barre de progression pour en avertir l’utilisateur.
Il faut donc isoler cette action longue dans un thread pour pouvoir laisser la barre se mettre à jour grâce au module Clock qui permet de lancer une tâche à intervalles réguliers.
Un exemple : la barre boucle jusqu’à la fin du thread (Exemple06)
Comme cet exemple permet de savoir la durée du thread, on peut donc facilement le transformer pour que la barre afficher le pourcentage de la tâche en cours
– builder.py
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivy.core.window import Window
from kivymd.toast import toast
from kivy.uix.screenmanager import Screen
from kivy.clock import Clock
from kivymd.toast import toast
import time
import threading
class MonAppliScreen(Screen) :
mon_bouton = ObjectProperty()
mon_progressbar = ObjectProperty()
def __init__(self, **kwargs):
super().__init__(**kwargs)
#Window.size = (800,600)
def bouton_cliquer(self) :
self.mon_progressbar.opacity = 1
self.event_clock = Clock.schedule_interval(self.progres_bar_update, 0.5)
self.event_thread = threading.Event()
self.mon_thread = threading.Thread(target=self.action_thread)
self.mon_thread.start()
def progres_bar_update(self,dt):
if self.mon_progressbar.value == 100:
self.mon_progressbar.value = 0
self.mon_progressbar.value = self.mon_progressbar.value +25
def action_thread(self) :
# ce qu'on veut qui dure
for k in range (5) :
time.sleep(1)
self.end_thread()
def end_thread(self) :
self.event_thread.clear()
self.event_clock.cancel()
self.mon_progressbar.value = 0
self.mon_progressbar.width = 0
class MonAppli(MDApp):
title = "Mon appli"
#icon = "Images/icon.png"
def build(self):
self.theme_cls.theme_style = "Light"
self.theme_cls.primary_palette = "Teal"
return Builder.load_file("design.kv")
if __name__ == '__main__':
MonAppli().run()
– design.kv
MonAppliScreen :
mon_bouton : mon_bouton
mon_progressbar : mon_progressbar
MDRaisedButton :
id : mon_bouton
text : "Cliquer"
pos_hint : {"center_x" : 0.5,"center_y" : 0.7}
on_release : root.bouton_cliquer()
MDProgressBar :
id : mon_progressbar
value : 0
pos_hint : {"center_x" : 0.5}
opacity : 0