Barre de progression en pop-up avec Python Kivy

introduction

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.

environnement

Personnaliser le widget contextuel

Utilisez la fenêtre contextuelle d'image suivante composée de trois parties: barre de progression, étiquette et bouton. 2017-04-23_14h29_40.png

De plus, les deux méthodes suivantes ont été ajoutées au widget contextuel.

  1. set_value (): Méthode pour mettre à jour la valeur et le libellé de la barre de progression
  2. ʻenable_close_button () `: Méthode pour activer le bouton pour fermer le popup

Le 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.

  1. 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.
  1. 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érateur self.gen à partir du générateurfunc_test ()ci-dessus. --Utilisez Clock.schedule_once () pour exécuter la méthode récursive pp_update () pour démarrer la boucle.

  1. 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. --Utilisez Clock.schedule_once () pour se rappeler jusqu'à ce que vous obteniez une StopIteration ou une autre erreur. --Si une erreur se produit, le bouton de la popup est activé afin que l'utilisateur puisse fermer la popup.

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()

Résumé

Ce qui précède peut être résumé comme suit. 2017-04-23_14h33_04_.gif

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

Barre de progression en pop-up avec Python Kivy
Celui qui affiche la barre de progression en Python
course de graphique à barres en python
Programmation GUI utilisant kivy ~ Partie 2 Barre de progression ~
[Python] Affichage de la progression par barre de progression en utilisant tqdm
[Python] Une barre de progression sur le terminal
Quadtree en Python --2
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
Rendre la progression de dd visible sur la barre de progression
Exemple pour mettre Python Kivy dans un fichier
Je veux afficher la progression en Python!
Liste triée en Python
AtCoder # 36 quotidien avec Python
Texte de cluster en Python
AtCoder # 2 tous les jours avec Python
Daily AtCoder # 32 en Python
Daily AtCoder # 6 en Python
Modifier les polices en Python
Motif singleton en Python
Téléchargez des fichiers tout en affichant la progression dans Python 3.x