J'ai pensé à afficher la progression de la fonction avec le widget de barre de progression installé dans le widget pop-up de Kivy. En utilisant la fonction pour laquelle vous souhaitez afficher la progression en tant que générateur, il semble que la barre de progression soit mise à jour à partir de la fonction.
Utilisez la fenêtre contextuelle d'image suivante composée de trois parties: barre de progression, étiquette et bouton.
De plus, les deux méthodes suivantes ont été ajoutées au widget contextuel.
set_value ()
: Méthode pour mettre à jour la valeur et le libellé de la barre de progressionLe code est comme suit.
Class-PopupProgress
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.progressbar import ProgressBar
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.label import Label
class PopupProgress():
def __init__(self, value_init=0, value_max=1, title='', size=None,
auto_close=False):
self._auto_close = auto_close
self._box = BoxLayout(orientation='vertical')
if size is None:
size_hint = (1,1)
else:
size_hint = (None, None)
self.popup = Popup(title=title,
content=self._box,
auto_dismiss=False,
size_hint=size_hint,
size=tuple(size)
)
# progress bar
self._pb = ProgressBar(max=value_max, value=value_init)
self._box.add_widget(self._pb)
# label
self._label = Label(text='')
self._box.add_widget(self._label)
# close button
self._button = Button(text='Close', height=40, size_hint_y=None,
disabled=True)
self._button.bind(on_press=self.popup.dismiss)
self._box.add_widget(self._button)
self.popup.open() #Ouvrez une fenêtre contextuelle
def set_value(self, value=None, message=''):
if not value is None:
self._pb.value = value
self._label.text = message
if self._pb.value_normalized>=1:
if self._auto_close:
self.popup.dismiss()
else:
self.enable_close_button()
def enable_close_button(self):
self._button.disabled = False
Root Widget En plus du constructeur (\ _ \ _ init \ _ \ _) pour créer des boutons, le widget racine dispose des trois méthodes suivantes.
func_test ()
: Méthode (générateur) qui veut vérifier la progression d'un traitement chronophage
- La méthode qui veut vérifier la progression d'un traitement chronophage est un générateur. --La progression et le message sont renvoyés en insérant
yield value, message
à l'endroit où vous souhaitez vérifier la progression du processus. --A la fin du processus,valeur = 1
est renvoyé et le bouton de fermeture est activé.- Ici, la valeur Max = 1 de la barre de progression est définie, mais toute valeur peut être définie avec
func_test_pp ()
.- Ici,
time.sleep (1)
est configuré pour imiter le processus chronophage.
func_test_pp ()
: Une méthode pour démarrer une boucle qui met à jour la valeur de la barre de progression--Créez une instance de la classe de widget pop-up
self.pp
. --Créez un objet itérateurself.gen
à partir du générateurfunc_test ()
ci-dessus. --UtilisezClock.schedule_once ()
pour exécuter la méthode récursivepp_update ()
pour démarrer la boucle.
pp_update ()
: Méthode récursive pour mettre à jour la valeur de la barre de progression--Après avoir référencé une fois l'objet itérateur
self.gen
, mettez à jour la valeur de la barre de progression. --UtilisezClock.schedule_once ()
pour se rappeler jusqu'à ce que vous obteniez uneStopIteration
ou une autre erreur. --Si une erreur se produit, le bouton de la popup est activé afin que l'utilisateur puisse fermer la popup.
Clock.schedule_once ()
était instable à 0 seconde, il est configuré pour être exécuté après 0,1 seconde pour le moment.Class-RootWidget etc.
from kivy.app import App
from kivy.clock import Clock
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
import time
class RootWidget(BoxLayout):
def __init__(self, **kwargs):
super(RootWidget, self).__init__(**kwargs)
button = Button(text='popup!')
button.bind(on_press=self.func_test_pp)
self.add_widget(button)
def pp_update(self, *args):
try:
value, message = next(self.gen)
self.pp.set_value(value, message)
Clock.schedule_once(self.pp_update, 0.1)
except StopIteration:
self.pp.enable_close_button()
except Exception as e:
self.pp.set_value(message=str(e))
self.pp.enable_close_button()
def func_test_pp(self, *args):
self.pp = PopupProgress(
title='TestPopupProgress',
size=(self.width/2, self.height/3)
)
self.gen = self.func_test()
Clock.schedule_once(self.pp_update, 0.1)
def func_test(self):
yield 0, 'Preparing...' #Utilisez yield pour renvoyer la progression actuelle et les commentaires (début)
#Traitement chronophage dont vous souhaitez vérifier la progression
allitems = 5
for i in range(allitems):
time.sleep(1) #Quelque chose de processus qui prend du temps
yield (i+1)/allitems, '{:d}/{:d}'.format(i+1, allitems) #Utilisez yield pour renvoyer la progression actuelle et les commentaires
yield 1, 'Complete.' #Utilisez yield pour renvoyer la progression actuelle et les commentaires (fin)
class TestPopupProgressApp(App):
def build(self):
return RootWidget()
if __name__ == '__main__':
TestPopupProgressApp().run()
Ce qui précède peut être résumé comme suit.
test_popup_progress.py
from kivy.app import App
from kivy.clock import Clock
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.progressbar import ProgressBar
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.label import Label
import time
class PopupProgress():
def __init__(self, value_init=0, value_max=1, title='', size=None,
auto_close=False):
self._auto_close = auto_close
self._box = BoxLayout(orientation='vertical')
if size is None:
size_hint = (1,1)
else:
size_hint = (None, None)
self.popup = Popup(title=title,
content=self._box,
auto_dismiss=False,
size_hint=size_hint,
size=tuple(size)
)
# progress bar
self._pb = ProgressBar(max=value_max, value = value_init)
self._box.add_widget(self._pb)
# label
self._label = Label(text='')
self._box.add_widget(self._label)
# close button
self._button = Button(text='Close', height=40, size_hint_y=None,
disabled=True)
self._button.bind(on_press=self.popup.dismiss)
self._box.add_widget(self._button)
self.popup.open()
def set_value(self, value=None, message=''):
if not value is None:
self._pb.value = value
self._label.text = message
if self._pb.value_normalized>=1:
if self._auto_close:
self.popup.dismiss()
else:
self.enable_close_button()
def enable_close_button(self):
self._button.disabled = False
class RootWidget(BoxLayout):
def __init__(self, **kwargs):
super(RootWidget, self).__init__(**kwargs)
button = Button(text='popup!')
button.bind(on_press=self.func_test_pp)
self.add_widget(button)
def pp_update(self, *args):
try:
value, message = next(self.gen)
self.pp.set_value(value, message)
Clock.schedule_once(self.pp_update, 0.1)
except StopIteration:
self.pp.enable_close_button()
except Exception as e:
self.pp.set_value(message=str(e))
self.pp.enable_close_button()
def func_test_pp(self, *args):
self.pp = PopupProgress(
title='TestPopupProgress',
size=(self.width/2, self.height/3)
)
self.gen = self.func_test()
Clock.schedule_once(self.pp_update, 0.1)
def func_test(self):
yield 0, 'Preparing...'
allitems = 5
for i in range(allitems):
time.sleep(1)
yield (i+1)/allitems, '{:d}/{:d}'.format(i+1, allitems)
yield 1, 'Complete.'
class TestPopupProgressApp(App):
def build(self):
return RootWidget()
if __name__ == '__main__':
TestPopupProgressApp().run()
Recommended Posts