Bonjour,

Débutant en Python depuis quelques jours et surtout à tout ce qui a attrait au 'Front End'.

J'ai essayé de faire un petit quelque chose de ce côté là en utilisant PySimpleGUI (qui est nouveau pour moi) ainsi que Matplotlib.
L'objectif du programme pour le moment est d'afficher différents graphiques liés à 2 objets (Bassin, Pluie) mais je rencontre un soucis dans l'affichage des graphiques.


Ca fait un petit moment que j'essaye de corriger le soucis sauf que je ne vois pas où il se trouve. Il n'y a pas d'erreur retournée.
Les deux premiers graphiques (1,1 & 1,2) fonctionnaient à un moment (les 2 autres ne sont pas paramétrés pour l'instant) mais ne fonctionnent plus maintenant.
Par rapport au moment où ça a fonctionné, j'ai bougé des blocs de code...

In-fine, j'aimerais que les objets Bassin & Pluie et plus particulièrement puisse s'initialiser avec le nom de qui est rentré dans le premier champ d'input du programme.
J'ai quelques doutes que ça fonctionne avec cet ordre de code là (même si ça a fonctionné à un moment...).

Si une bonne âme peut y jeter un oeil avec son oeil avisé ?

Merci par avance

Les deux fichiers de données Excel sont ci-dessous :
Hauteur_eau_D1.xlsx
Pluviométrie.xlsx

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
 
# Imports tools
 
from datetime import datetime
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
 
import PySimpleGUI as sg
 
# Import specific classes
#.........
 
 
# Classe Bassin
class Bassin:
    def __init__(self, nom, h_eau, z_fond, z_top, s_fond, s_top):
        self.nom = nom          #string
        self.h_eau = h_eau      # array
        self.z_fond = z_fond    # float
        self.z_top = z_top      # float
        self.s_fond = s_fond    # float
        self.s_top = s_top      # float
 
    # def __call__(self):
    #    print (f'Bassin {self.nom} a été créé avec la géométrie : \n Alti fond : {self.z_fond} \n Alti top : {self.z_top} \n Surface fond : {self.s_fond} \n Surface top : {self.s_top} ')
 
 
    # Methods
    def calc_vol_inst(self, date_inst):
        volume_instant = 1/3*(self.h_eau[date_inst]*(self.s_top+self.s_fond+pow(self.s_top*self.s_fond,0.5)))      # En attendant une loi de remplissage spécifique
        #print('Volume instantané présent dans bassin le {} : {:.1f} m3'.format(date_inst, volume_instant[date_inst]))
        return volume_instant
 
    def calc_vol_jour(self, date_jour):
        volume_instant = 1/3*(self.h_eau[date_jour]*(self.s_top+self.s_fond+pow(self.s_top*self.s_fond,0.5)))      # En attendant une loi de remplissage spécifique
        diff_volume = np.ediff1d(volume_instant)
        A=[0]
        diff_volume_resized = np.insert(diff_volume, 0, A)
        gain_volume_individual = (diff_volume_resized > 0)*diff_volume_resized
        #print('Volume gagné par le bassin le {} : {:.1f} m3'.format(date_jour, gain_volume_period))
        return gain_volume_individual
 
    def calc_vol_jour_sum(self, date_jour):
        volume_instant = 1/3*(self.h_eau[date_jour]*(self.s_top+self.s_fond+pow(self.s_top*self.s_fond,0.5)))      # En attendant une loi de remplissage spécifique
        diff_volume = np.ediff1d(volume_instant)
        A=[0]
        diff_volume_resized = np.insert(diff_volume, 0, A)
        gain_volume_individual = (diff_volume_resized > 0)*diff_volume_resized
        gain_volume_period = gain_volume_individual.sum()
        #print('Volume gagné par le bassin le {} : {:.1f} m3'.format(date_jour, gain_volume_period))
        return gain_volume_period
 
    def calc_vol_ajutage(self, date_jour, h_eau_min):
        h_eau_filtered = (self.h_eau[date_jour] > h_eau_min)*self.h_eau[date_jour];
        volume_ajutage_instant = (0.8*0.025*0.025*3.14*pow(2*9.81*h_eau_filtered[date_jour],0.5)*3600)
        # print('Volume ajuté par le bassin le {} : {:.1f} m3'.format(date_jour, volume_ajutage_instant))
        return volume_ajutage_instant
 
    def calc_vol_ajutage_sum(self, date_jour, h_eau_min):
        h_eau_filtered = (self.h_eau[date_jour] > h_eau_min)*self.h_eau[date_jour];
        volume_ajutage_instant = (0.8*0.025*0.025*3.14*pow(2*9.81*h_eau_filtered[date_jour],0.5)*3600).sum()
        print('Volume ajuté par le bassin le {} : {:.1f} m3'.format(date_jour, volume_ajutage_instant))
        return volume_ajutage_instant
 
# Classe Pluie
class Pluie:
    def __init__(self, surface, intensite):
        self.surface = surface       #float
        self.intensite = intensite   #array
 
    def calc_volume_pluie_jour(self, date_jour):
        volume_pluie_jour = ((self.intensite[date_jour] * self.surface) / 1000)
        #print('Volume de pluie du {} : {:.1f} m3'.format(date_jour, volume_pluie_jour))
        return volume_pluie_jour   
 
    def calc_volume_pluie_jour_sum(self, date_jour):
        volume_pluie_jour = ((self.intensite[date_jour] * self.surface) / 1000).sum()
        #print('Volume de pluie du {} : {:.1f} m3'.format(date_jour, volume_pluie_jour))
        return volume_pluie_jour   
 
 
 
# Variables Bassin
Nom_bassin = 'D1'
print('Récupération des données du bassin', Nom_bassin,'.........','\n')
Bassin_Data = pd.read_excel('Hauteur_eau_{}.xlsx'.format(Nom_bassin), index_col = 'Date', parse_dates=True)
 
Bassin_heau = Bassin_Data["Hauteur d'eau"]
Bassin_z_fond = 636
Bassin_z_top = 637.4
Bassin_s_fond = 228
Bassin_s_top = 404
 
# Bassin : Création objet
bassin1 = Bassin(Nom_bassin, Bassin_heau, Bassin_z_fond, Bassin_z_top, Bassin_s_fond, Bassin_s_top)
 
# Variables Pluie
Pluie_Data = pd.read_excel('Pluviométrie.xlsx', index_col = 'Date', parse_dates=True)
pluie_surface = 6125.0
pluie_intensite = Pluie_Data["Intensite"]
 
# Pluie : Création objet
print('Initialisation des données de pluviométrie pour', Nom_bassin,'.........','\n')
pluie1 = Pluie(pluie_surface, pluie_intensite)
 
 
# User interface
 
def update_figure(date_start, date_fin):   
    axes = fig.axes    
    plt.subplot(2,2,1)
 
    dates = pd.date_range(start=date_start, end=date_fin, freq='H')
 
    val_vol_pluie = pluie1.calc_volume_pluie_jour(dates)
    print(val_vol_pluie)
    axes[0].bar(dates, val_vol_pluie)
    axes[0].grid
    axes[0].set_title('Volume de pluie / Surface référence')
    axes[0].set_ylabel('Volume (m3)')
 
    plt.subplot(2,2,2)
    val_vol_bassin = bassin1.calc_vol_jour(dates)
    axes[1].bar(dates, val_vol_bassin)
    axes[1].grid
    axes[1].set_title('Volume instantané dans bassin par heure')
    axes[1].set_ylabel('Volume (m3)')
 
    figure_canvas_agg.draw()
    figure_canvas_agg.get_tk_widget().pack()
 
sg.theme('DarkTeal7')
 
layout = [
        [sg.Input(default_text= 'D1',key = '-BASSIN_NOM-', expand_x=True)],
        [sg.Input(default_text= '2022-06-01', key = '-DATE DEBUT-', expand_x=True)],
        [sg.Input(default_text= '2022-06-02', key = '-DATE FIN-', expand_x=True)],
        [sg.Button('Submit Date')],
        [sg.Text(size=(10,1), justification = 'left', key='-DATE-',text_color = 'black', background_color = 'white')],
        [sg.Button('Draw Volume contenu dans bassin')],
        [sg.Canvas(key = '-CANVAS-')]
]
 
window = sg.Window('Bassin Monitoring', layout, finalize=True)
 
# Matplotlib
fig = plt.Figure(figsize = (25,10))
fig.add_subplot(2,2,1).plot([],[])
fig.add_subplot(2,2,2).plot([],[])
fig.add_subplot(2,2,3).plot([],[])
fig.add_subplot(2,2,4).plot([],[])
 
figure_canvas_agg = FigureCanvasTkAgg(fig, window['-CANVAS-'].TKCanvas)
figure_canvas_agg.draw()
figure_canvas_agg.get_tk_widget().pack()
 
 
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break
 
    if event == 'Submit Date':
        Nom_bassin = values['-BASSIN_NOM-']
        date_start = values['-DATE DEBUT-']
        date_fin = values['-DATE FIN-'] 
        if isinstance((date_start, date_fin), str):
            window['-BASSIN_NOM-'].update(Nom_bassin)
            window['-BASSIN_NOM-'].update('')
            window['-DATE DEBUT-'].update(date_start)
            window['-DATE DEBUT-'].update('')
            window['-DATE FIN-'].update(date_fin)
            window['-DATE FIN-'].update('')
 
        if event == 'Draw Volume contenu dans bassin':
            update_figure(date_start, date_fin)
 
window.close()