Exemplo n.º 1
0
 def initialisation_affichage(self):
     """ Affiche les paramètres de la simulation
     ---
     """
     x = 1
     for clee in self.clees:
         pygame.draw.line(self.ecran, self.color_dict[clee],
                          (1700, 175 + self.DELTA * x),
                          (1800, 175 + self.DELTA * x), 2)
         centrer_texte(self.ecran, self.police, " ".join(clee.split("_")),
                       FG, 300, 50, 130 + self.DELTA * x, 1600)
         x += 1
Exemplo n.º 2
0
 def mettre_a_jour_monde(self):
     """ Met à jour les informations mondiales
     ---
     """
     # On change la barre d'information
     creer_masque(0, 1550, 400, 120, BG, self.ecran)
     afficher_texte(self.ecran, "Monde", (1600, 30), 60, 300, 80)
     self.mettre_a_jour_information_monde()
     # On change le titre du grahique
     creer_masque(650, self.GAUCHE - 5, self.LARGEUR, 30, BG, self.ecran)
     centrer_texte(self.ecran, self.police, f"Evolution mondiale", FG,
                   self.LARGEUR, 30, 650, self.GAUCHE - 5)
Exemplo n.º 3
0
 def mettre_a_jour_information_monde(self):
     """ Affiche les valeurs mondiales
     ---
     """
     # On change la barre d'information
     creer_masque_information(self.nb_param, self.ecran)
     centrer_texte(self.ecran, self.police_donnee, f"{self.N}", FG, 300, 50,
                   160, 1600)
     x = 1
     for clee in self.param_dict_monde:
         if clee not in self.liste_noire:
             centrer_texte(self.ecran, self.police_donnee,
                           f"{int(self.param_dict_monde[clee][-1])}", FG,
                           300, 40, 175 + self.DELTA * x, 1600)
             x += 1
Exemplo n.º 4
0
 def run(self):
     """ Lance la simulation et l'affichage du graphique
     ---
     """
     # Affiche les pays
     for c in self.gbdd.liste_pays:
         c.afficher(self.ecran)
     # Affiche mes textes
     centrer_texte(self.ecran, self.police, "Population de départ", FG, 300,
                   50, 130, 1600)
     self.ecran.blit(self.police.render("Épidémie de COVID-19", True, FG),
                     (20, 0))
     # Récupère les modèles et initialise la simulation
     self.models = self.gbdd.liste_modeles
     # On charge les pays
     self.initialisation_modeles()
     # On charge les donées du monde
     self.mettre_a_jour_monde()
     # On affiche les éléments qui ne bougeront jamais
     self.initialisation_affichage()
     x = 1
     # On récupère les données du premier jour
     self.generer_donnee(x)
     while x < self.nb_iterations[self.pays_pour_date]:
         # On ajoute un jour à l'abcsisse
         self.y.append(len(self.y))
         # On récupère les données du jour
         self.generer_donnee(x)
         # Met à jour les données associée à la position de la souris sur le graphique si elle y est
         self.valeur_sur_graphique()
         # Affiche soit les donnée du pays soit celles du monde
         if self.sur_pays:
             self.mettre_a_jour_information_pays()
         else:
             self.mettre_a_jour_information_monde()
         # Si on peut construire un graphique, on le fait
         if len(self.param_dict[self.num_model][self.clees[0]]) >= 2:
             # Si on est sur un pays
             if self.sur_pays:
                 self.afficher_pays()
             # Sinon on affiche le monde
             else:
                 self.afficher_monde()
             pygame.display.update()
         # On passe au jour suivant
         x += 1
     # On se déconnecte de la base de données, puisque tout a été chargé
     self.gbdd.fermer()
Exemplo n.º 5
0
 def mettre_a_jour_information_pays(self):
     """ Affiche les valeurs du pays sélétionnné
     ---
     """
     # On change la barre d'information
     creer_masque_information(self.nb_param, self.ecran)
     model = self.models[self.num_model]
     # On affiche la population du monde
     centrer_texte(self.ecran, self.police_donnee, f"{model.N}", FG, 300,
                   50, 160, 1600)
     x = 1
     for clee in model.param_dict:
         if not clee in self.liste_noire:
             # On affiche la valeur du monde associée à la clée
             centrer_texte(self.ecran, self.police_donnee,
                           f"{int(model.param_dict[clee]['value'])}", FG,
                           300, 40, 175 + self.DELTA * x, 1600)
             x += 1
     return model
Exemplo n.º 6
0
    def valeur_sur_graphique(self):
        """ Affiche les valeurs du graphique à la position de la souris
        ---
        résultat :

            - int, int
        """
        # Si un masque doit être créé pour réécrire les valeur au point de la souris
        if self.mettre_masque:
            creer_masque(600, 10, 200, 70, BG, self.ecran)
            self.mettre_masque = False

        # la position de la souris sur l'écran
        x, y = pygame.mouse.get_pos()
        if self.sur_pays:
            # Si la souris est sur le graphique pays
            if dans_rect(self.BORD_GRAPHIQUE, x, y) and len(
                    self.param_dict_monde):
                # On convertit l'abcsisse en un entier qui sera le numéro associé à la date
                numero_date = int(
                    (x - self.BORD_GRAPHIQUE[0]) * self.COEF_LARGEUR *
                    len(self.param_dict_monde[self.clees[0]]))
                # Si le numéro est plus grand que les dates existantes
                if numero_date >= len(self.models[self.num_model].date):
                    numero_date = -1
                # On affiche la date
                centrer_texte(
                    self.ecran, self.police_donnee,
                    f"Date : {self.models[self.num_model].date[numero_date]}",
                    FG, 150, 50, 600, 15)
                # On affiche la valeur
                centrer_texte(
                    self.ecran, self.police_donnee, "Valeur : {:.2e}".format(
                        int((self.BORD_GRAPHIQUE[1] - y) * self.COEF_HAUTEUR *
                            max([
                                max(self.param_dict[self.num_model][x])
                                for x in self.param_dict[self.num_model]
                            ]))), FG, 150, 50, 630, 15)
                self.mettre_masque = True
        else:
            # Si la souris est sur le graphique mondial
            if dans_rect(self.BORD_GRAPHIQUE, x, y) and len(
                    self.param_dict_monde):
                # On convertit l'abcsisse en un entier qui sera le numéro associé à la date
                numero_date = int(
                    (x - self.BORD_GRAPHIQUE[0]) * self.COEF_LARGEUR *
                    len(self.param_dict_monde[self.clees[0]]))
                # Si le numéro est plus grand que les dates existantes
                if numero_date >= len(self.liste_date):
                    numero_date = -1
                # On affiche la date
                centrer_texte(self.ecran, self.police_donnee,
                              f"Date : {self.liste_date[numero_date]}", FG,
                              150, 50, 600, 15)
                # On affiche la valeur
                centrer_texte(
                    self.ecran, self.police_donnee, "Valeur : {:.2e}".format(
                        int((self.BORD_GRAPHIQUE[1] - y) * self.COEF_HAUTEUR *
                            max([
                                max(self.param_dict_monde[x])
                                for x in self.clees
                            ]))), FG, 150, 50, 630, 15)
                self.mettre_masque = True
        return x, y
Exemplo n.º 7
0
    def changer_pays(self, numero_pays):
        """ Change le graphique du pays donnés
        ---
        paramètres :

            - numero_pays (int) le numéro du pays donné
        """
        # Si le pays est dans la base de données
        if numero_pays < len(self.liste_tag):
            # On récupère le tag et le pays correspondant
            tag = self.liste_tag[numero_pays]
            a = [
                n for n in range(len(self.models))
                if self.models[n].pays.tag == tag
            ]
            # L'affichage doit désormais afficher les données de ce pays
            self.pays_selectione = numero_pays
            # Si le pays a été trouvé
            if len(a) > 0:
                self.num_model = a[0]
                # On met à jour l'intitulé du graphique
                creer_masque(650, self.GAUCHE - 5, self.LARGEUR, 30, BG,
                             self.ecran)
                centrer_texte(
                    self.ecran, self.police,
                    f"Evolution locale ({self.models[self.num_model].pays.nom})",
                    FG, self.LARGEUR, 30, 650, self.GAUCHE - 5)
                # On met à jour la barre d'informations
                self.mettre_a_jour_information_pays()
                # Si on a au moins deux points, on peut afficher les données
                if len(self.param_dict[self.num_model][self.clees[0]]) >= 2:
                    self.afficher_pays()
                # On "efface" la barre d'information
                creer_masque(self.DIST_HAUT + 10, self.GAUCHE - 80, 100,
                             self.HAUTEUR - self.MARGE, BG, self.ecran)
                creer_masque(self.DIST_HAUT - 10, self.GAUCHE + 25, 5,
                             self.HAUTEUR - self.MARGE, BG, self.ecran)
                # Cherche la valeur maximale pour avoir la hauteur maximale du graphique
                mx = max([
                    max(self.param_dict[self.num_model][x])
                    for x in self.param_dict[self.num_model]
                ])
                # On affiche les traits sur le graphique et on ajoute le nombre à côté
                if mx > 0:
                    x_coord = echelloner_valeur(0, mx, 10)
                    dx = self.H / mx
                    for x in x_coord:
                        form = "{:.2e}".format(int(x))
                        w = self.police_donnee.size(form)[0]
                        Y = self.HAUT - int(x * dx)
                        pygame.draw.line(
                            self.ecran, FG,
                            (self.MARGE + self.GAUCHE, Y + self.DIST_HAUT),
                            (self.MARGE - 5 + self.GAUCHE, Y + self.DIST_HAUT),
                            2)
                        self.ecran.blit(
                            self.police_donnee.render(form, True, FG),
                            ((self.MARGE - w) + self.GAUCHE - 10,
                             Y - 10 + self.DIST_HAUT))

            # Par défaut on affiche le monde
            else:
                if not self.sur_pays:
                    self.retour_monde()