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

Python Discussion :

Récupérer la valeur d'une fonction dans une autre fonction


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 3
    Par défaut Récupérer la valeur d'une fonction dans une autre fonction
    Bonjour à tous,

    J'essaie de faire une station météo pour mon raspberry. Dans ma 1ère version, tout fonctionnait très sauf que mon timer de rappel etait trop court (0.4sec) donc je prenais des timeout de la part du serveur de l'API météo.

    J'ai repensé tous le code. je me retourve donc avec 3 fichiers (que j'aimerais gardé comme ça) le premier sert à la mise a jour du fichier JSON, le 2eme, à la mise a jour de la vitesse du vent et le 3eme à l'affichage à l'écran.

    Tout fonctionne bien SAUF, l'affichage du JSON.

    Voici le fichier de mise à jour du JSON:
    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
     
    # -- Python modules
    import pygame as pg
    import requests as rq
    from time import sleep, strftime
    # -- Personnal modules
    from ui import loop, mode, constants as cst
    from timestamp import lclock
    from weather import wind
     
    from os import system
     
     
    class WeatherUpdate:
     
        def __init__(self, screen):
            self.screen = screen
            self.lisawind = wind.LSWind(self.screen)
            self.display_mode = mode.DisplayMode(self.screen)
     
        def json_request(self):
            self.api_link = "https://api.openweathermap.org/data/2.5/weather?q=castelnau-le-lez&lang=fr&appid=738e9d1489491771d579f8b5db5fd21a"
            self.json_data = rq.get(self.api_link).json()
     
            print("server request")
            return self.json_data
     
        def full_update(self, counter):
            for _ in range(6):
                self.lisawind.wind_request(self.json_request())
                self.display_mode.time_slot()
                counter.loop_increase()
                print(counter.get_loop_value())
     
                if counter.get_loop_value() == 20:
                    self.lisawind.wind_request(self.weather_request())
                    counter.loop_value = 0
     
                sleep(0.5)
                system('clear')
    Voici le fichier de mise a jour de la vitesse du vent
    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
     
    # -- Python modules
    import pygame as pg
    # -- Personnal modules
    from ui import constants as cst
     
     
    class LSWind:
     
        def __init__(self, screen):
            self.screen = screen
            self.w_font = pg.font.SysFont("", 50)
     
        def wind_request(self, json_data):
            self.w_speed = json_data['wind']['speed']
     
        def wind_display(self, color):
            self.w_km = " Km/h"
            self.w_current_speed = int(self.w_speed * 3600 / 1000)
            self.w_display = str(self.w_current_speed) + self.w_km
     
            self.screen.master.blit(cst.WIND_FLAG, (630, 318))
            self.show_w = self.w_font.render(self.w_display, True, color)
            self.center_y = (344 - (self.show_w.get_height() / 2) + 5)
            self.screen.master.blit(self.show_w, (700, self.center_y))
     
            return self.w_display
    Et voici le fichier d'affichage à l'écran
    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
     
    # -- Python modules
    import pygame as pg
    from time import strftime
    # -- Personnal modules
    from ui import constants as cst
    from timestamp import lclock, ldate
    from weather import wind
     
     
    class DisplayMode:
     
        def __init__(self, screen):
            self.screen = screen
            self.lisaclock = lclock.LSClock(self.screen)
            self.lisadate = ldate.LSDate(self.screen)
            self.lisawind = wind.LSWind(self.screen)
     
        def time_slot(self):
            self.hour = strftime("%H")
            self.mn = strftime("%M")
            self.current_time = strftime("%H:%M")
            self.screen.master.blit(cst.BACKGROUND, (0, 0))
     
            if "09" <= self.hour <= "21":
                self.light()
            else:
                self.dark()
     
            pg.display.flip()
     
        def light(self):
            self.lisaclock.centering(self.current_time, cst.GREEN)
            self.lisadate.centering(cst.CYAN)
            self.lisawind.wind_display(cst.WHITE)
     
        def dark(self):
            self.lisaclock.centering(self.current_time, cst.GREY)
            self.lisadate.centering(cst.GREY)
            self.lisawind.wind_display(cst.GREY)
    Concrètement, mon problème vient du fait que dans la fonction d'affichage 'wind_display()', j'appelle "self.w_speed" contenu dans la fonction "wind_request()" or, ile me donne ce message d'erreur
    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
     
    Traceback (most recent call last):
      File "LisaClock.py", line 34, in <module>
        main()
      File "LisaClock.py", line 27, in main
        lisawupd.full_update(lisaloop)
      File "/home/priyamoon/RASPBERRY/PROJECTS/LisaClock/updates/wupdate.py", line 38, in full_update
        self.display_mode.time_slot()
      File "/home/priyamoon/RASPBERRY/PROJECTS/LisaClock/ui/mode.py", line 33, in time_slot
        self.light()
      File "/home/priyamoon/RASPBERRY/PROJECTS/LisaClock/ui/mode.py", line 42, in light
        self.lisawind.wind_display(cst.WHITE)
      File "/home/priyamoon/RASPBERRY/PROJECTS/LisaClock/weather/wind.py", line 28, in wind_display
        self.w_current_speed = int(self.w_speed * 3600 / 1000)
    AttributeError: 'LSWind' object has no attribute 'w_speed'
    Ma question est donc : Comment puis-je utiliser la valeur du JSON dans ma fonction d'affichage ?
    Désolé c'est long mais je voulais être sûr d're assez clair.

    Merci à vous

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

    Vu comme vous avez écrit votre code, l'attribut w_speed de l'objet LSWind n'existe qu'après l'exécution de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        def wind_request(self, json_data):
            self.w_speed = json_data['wind']['speed']
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 3
    Par défaut
    D'abord, merci de votre réponse.

    C'est ce que je pensais mais si j'appelle la fonction 'wind_request()' il va fatalement me demander le parametre JSON, du coup je vois pas comment faire puisque que ce parametre est appeler ailleur deja..

    Je m'arrache les cheveux la dessus mais c'est le dernier point, après tout sera opérationnel

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Ayckinn Voir le message
    Concrètement, mon problème vient du fait que dans la fonction d'affichage 'wind_display()', j'appelle "self.w_speed" contenucréé dans la fonction "wind_request()"
    Comme tu vois, être exact permet de mieux cibler le souci. Parce que ton attribut "w_speed" n'est pas "contenu", il est "créé" et ce seul changement de verbe fait toute la différence. Car comme l'a dit wiztricks, si on ne passe pas dans la méthode, alors pas création de l'attribut.
    Donc tu crées tous tes attributs à la création de l'objet, ce qui évite justement d'arriver dans ce cas de figure. C'est pas pour rien qu'il existe la méthode "__init__()". Et si l'attribut n'est pas encore "remplissable" tu le mets à None. Au-moins, il existe.

    Citation Envoyé par Ayckinn Voir le message
    C'est ce que je pensais mais si j'appelle la fonction 'wind_request()' il va fatalement me demander le parametre JSON, du coup je vois pas comment faire puisque que ce parametre est appeler ailleur deja..
    Déjà la phrase me semble assez incompréhensible. Qui va te demander quelque chose ??? Tu appelles une fonction tu lui passes ce dont elle a besoin pour travailler. Et peu importe si ce dont elle a besoin est appelé ailleurs déjà car quand elle tourne, ce "ailleurs déjà", lui, ne tourne pas (ou alors tu es en multithreads et là c'est une autre façon de gérer).

    Citation Envoyé par Ayckinn Voir le message
    mais c'est le dernier point, après tout sera opérationnel
    Oui, c'est ce qu'on croit souvent...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 3
    Par défaut
    Comme tu vois, être exact permet de mieux cibler le souci. Parce que ton attribut "w_speed" n'est pas "contenu", il est "créé" et ce seul changement de verbe fait toute la différence. Car comme l'a dit wiztricks, si on ne passe pas dans la méthode, alors pas création de l'attribut.
    Donc tu crées tous tes attributs à la création de l'objet, ce qui évite justement d'arriver dans ce cas de figure. C'est pas pour rien qu'il existe la méthode "__init__()". Et si l'attribut n'est pas encore "remplissable" tu le mets à None. Au-moins, il existe.
    Avec mes excuses si je n'ai pas utilisé les bons mots, effectivement, s'ils changent toute la compréhension de mon problème, je dois y faire attention..
    Je n'ai pas encore tous les reflexes et les bonnes pratiques mais j'apprends, d'où ma présence ici.
    A l'évidence ça paraît bête comme erreur.. Mais je prends note, c'est interessant..

    Oui, c'est ce qu'on croit souvent...
    Je sais,..

    Au passage, merci pour la réctification, j'avais vu l'erreur et j'ai dû en faire d'autres, j'écris assez vite et je ne prends pas le temps de me relire mais promis, je sais écrire !
    Merci d'avoir pris le temps de me répondre, je pense voir ce que tu as voulu dire, ça va m'être très utile pour un autre projet..

Discussions similaires

  1. Récupérer les valeurs d'une autre class
    Par nevrhappen dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 19/04/2020, 13h28
  2. Récupérer les valeurs d'une autre table
    Par salmabarik dans le forum SAS Base
    Réponses: 1
    Dernier message: 25/01/2018, 10h11
  3. Réponses: 1
    Dernier message: 05/06/2015, 15h13
  4. Réponses: 18
    Dernier message: 18/04/2014, 21h42
  5. [Dojo] DataGrid récupérer la valeur d'une autre colonne
    Par iroze dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 04/06/2010, 14h31

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