Kivy et la ProgressBar

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