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 :

[Kivy] Affichage "dynamique" pendant qu'un process s'execute en Arrière plan [Python 2.X]


Sujet :

GUI Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 53
    Par défaut [Kivy] Affichage "dynamique" pendant qu'un process s'execute en Arrière plan
    Bonjour à tous,

    Dans l'appli Kivy que je développe (sur Raspberry + écran tactile), Je souhaite lorsque je quitte l'application générer un graphe avec matplotlib.

    Problème

    La génération de ce(s) graphe(s) met une 20aine de secondes. Pendant ce temps l'appli Kivy "freeze", une fois le graph generé, celle-ci peut enfin se quitter. Met l'utilisateur voir un écran qui ne répond pas pendant au moins 15 secondes, sans aucune informations...

    Solution
    Informer l'utilisateur, et c'est là que ça coince... j'ai essayé avec un pop up Kivy, avec un Label qui apparaitrait à ce moment donné, mais rien ne semble fonctionner...

    Mon code :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
        def fermerBanc(self):  
     
          [...]
     
            if(passerelle.graph1.flagGraph):
     
                p1 = Process(target=process_graph, args=(list_argument_graph_1,))
                p2 = Process(target=process_graph, args=(list_argument_graph_2,))
                p3 = Process(target=process_graph, args=(list_argument_graph_3,))
                p4 = Process(target=process_graph, args=(list_argument_graph_4,))
     
                try:
                    p1.start()
                except AttributeError:
                    Logger.warning('fermerBanc: impossible de generer un graph 1, fichier vide')
     
                try:
                    p2.start()  
                    pass
                except AttributeError:
                    Logger.warning('fermerBanc: impossible de generer un graph 2, fichier vide')
     
                try:
                    p3.start()
                    pass
                except AttributeError:
                    Logger.warning('fermerBanc: impossible de generer un graph 3, fichier vide')
     
                try:
                    p4.start()
                    pass              
                except AttributeError:
                    Logger.warning('fermerBanc: impossible de generer un graph 4, fichier vide')
     
                self.msgWarning = Label(text="Merci de patienter...", font_size='55sp', size=(100, 50), pos_hint={'center_x': .5, 'center_y':.5})
                self.add_widget(self.msgWarning)
     
                p1.join()
                p2.join()
                p3.join()
                p4.join()
     
            exit()
    Merci d'avance !!

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Salut,

    Si vous lancez vos process et que vous attendez qu'ils se terminent avant de rendre la main à Kivy, l'affichage restera gelé... (comme avec n'importe quelle interface graphique).

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

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 53
    Par défaut
    J'avais aussi essayé :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
      passerelle.start_stop = 0
     
            self.msgWarning = Label(text="Merci de patienter...", font_size='55sp', size=(100, 50), pos_hint={'center_x': .5, 'center_y':.5})
            self.add_widget(self.msgWarning)
     
     
        [...]
     
     
            if(passerelle.graph1.flagGraph):
                # t1=Thread_graph(chemin=chemin1, y_low_min=passerelle.graph1.y_low_min, y_low_max=passerelle.graph1.y_low_max, y_high_min=passerelle.graph1.y_high_min, y_high_max=passerelle.graph1.y_high_max, format_graph=passerelle.graph1.setTaille)
                # t2=Thread_graph(chemin=chemin2, y_low_min=passerelle.graph1.y_low_min, y_low_max=passerelle.graph1.y_low_max, y_high_min=passerelle.graph1.y_high_min, y_high_max=passerelle.graph1.y_high_max, format_graph=passerelle.graph1.setTaille)
                # t3=Thread_graph(chemin=chemin3, y_low_min=passerelle.graph1.y_low_min, y_low_max=passerelle.graph1.y_low_max, y_high_min=passerelle.graph1.y_high_min, y_high_max=passerelle.graph1.y_high_max, format_graph=passerelle.graph1.setTaille)
                # t4=Thread_graph(chemin=chemin4, y_low_min=passerelle.graph1.y_low_min, y_low_max=passerelle.graph1.y_low_max, y_high_min=passerelle.graph1.y_high_min, y_high_max=passerelle.graph1.y_high_max, format_graph=passerelle.graph1.setTaille)
                p1 = Process(target=process_graph, args=(list_argument_graph_1,))
     
                p2 = Process(target=process_graph, args=(list_argument_graph_2,))
     
                p3 = Process(target=process_graph, args=(list_argument_graph_3,))
     
                p4 = Process(target=process_graph, args=(list_argument_graph_4,))
     
     
                try:
                    p1.start()
     
     
                except AttributeError:
                    Logger.warning('fermerBanc: impossible de generer un graph 1, fichier vide')
     
                try:
                    p2.start()
     
                    pass
     
                except AttributeError:
                    Logger.warning('fermerBanc: impossible de generer un graph 2, fichier vide')
     
                try:
                    p3.start()
     
                    pass
                except AttributeError:
                    Logger.warning('fermerBanc: impossible de generer un graph 3, fichier vide')
     
                try:
                    p4.start()
     
                    pass              
                except AttributeError:
                    Logger.warning('fermerBanc: impossible de generer un graph 4, fichier vide')
     
     
     
                p1.join()
                p2.join()
                p3.join()
                p4.join()
     
     
     
     
     
            exit()
    Mais ça ne change rien...


    EDIT : commenter la ligne me donne le résultat suivant :
    -le programme génère les graphes PUIS affiche le "Merci de patienter..." Même si le "add_widget" est au début de ma fonction. J'ai l'impression que peu importe ou se situe mon ajout du label sur l'écran dans le code, celui ci s'effectuera à la fin de ma fonction...

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Citation Envoyé par StanSmooth Voir le message
    J'avais aussi essayé :
    ...
    Mais ça ne change rien...
    Normal, vous pourriez aussi remplacer vos process par un time.sleep(...), vous auriez le même résultat: interface bloquée.
    Un interface graphique, c'est une programmation pilotée par les événements qui iront déclencher des callbacks... fonctions qui devront se terminer le plus rapidement possible pour que l'interface reste réactive.
    Ça a des conséquences sur la façon de programmer.
    Et Kivy n'est pas la bibliothèque graphique qui permet au débutant d'appréhender facilement tout çà: vous êtes supposé le savoir "avant" (et l'avoir appris en utilisant des bibliothèques plus simples ) ainsi que d'être à l'aise avec la POO.

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

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 53
    Par défaut
    Très bien mais dans ce cas comment contourner ce problème ? Je ne pense pas que supprimer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                p1.join()
                p2.join()
                p3.join()
                p4.join()
    Soit une bonne idée, puisque une fois mon appli kivy quitté, j'aurais des process "en liberté", et que je souhaite que l'utilisateur reste dans l'interface kivy tant que les graphes ne sont pas generés.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Citation Envoyé par StanSmooth Voir le message
    Très bien mais dans ce cas comment contourner ce problème ?
    Vous ne pouvez rien contourner, juste apprendre à faire avec.
    Et le sujet étant comment intégrer dans son application Kivy des activités asynchrones, vous pouvez essayer de vous inspirer de cet article du Wiki de Kivy (ou chercher par vous même des solutions sur Internet).

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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. affichage statistique "dynamique"
    Par nezdeboeuf62 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 13/04/2007, 14h05
  2. probléme affichage images dynamiques
    Par abdelfettah2007 dans le forum Langage
    Réponses: 1
    Dernier message: 15/03/2007, 00h20
  3. Affichage courbe dynamique
    Par Polux95 dans le forum Qt
    Réponses: 11
    Dernier message: 14/03/2007, 13h37
  4. [FLASH MX2004] Pb d'affichage texte dynamique
    Par mohican13 dans le forum Flash
    Réponses: 6
    Dernier message: 01/02/2005, 09h55
  5. [FLASH MX 2004] Affichage texte dynamique
    Par Sun3clipse dans le forum Flash
    Réponses: 8
    Dernier message: 25/06/2004, 16h24

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