def __init__(self): self.primera_vez = True self.builder = Gtk.Builder() self.builder.add_from_file(UI_FILE) self.builder.connect_signals(self) self.win=self.builder.get_object('window1') self.grid_graf=self.builder.get_object('grid_graf') #~ self.grid1 = self.builder.get_object('grid1') #~ self.calendario = Gtk.Calendar() #~ self.grid1.attach(self.calendario,6,2,1,1) self.status = '' self.statusbar = self.builder.get_object('statusbar') self.statusbar.push(0,self.status) self.ui_label = {} for label in labels: self.ui_label[label] = self.builder.get_object(label) ancho = 400 alto = 150 self.grafico1 = StripChart(ancho, alto, font_face='Noto Sans', font_size=11) self.grafico2 = StripChart(ancho, alto, font_face='Noto Sans', font_size=11) self.grafico3 = StripChart(ancho, alto, font_face='Noto Sans', font_size=11) self.grafico4 = StripChart(ancho, alto, tipo='puntos', font_face='Noto Sans', font_size=11) self.grafico5 = StripChart(ancho, alto, font_face='Noto Sans', font_size=11) self.grafico6 = StripChart(ancho, alto, font_face='Noto Sans', font_size=11) self.grid_graf.attach(self.grafico1,0,0,1,1) self.grid_graf.attach(self.grafico2,1,0,1,1) self.grid_graf.attach(self.grafico3,0,1,1,1) self.grid_graf.attach(self.grafico4,1,1,1,1) self.grid_graf.attach(self.grafico5,0,2,1,1) self.grid_graf.attach(self.grafico6,1,2,1,1) self.grafico1.set_ejes(duracion, intervalo_muestreo, None, None, 5) self.grafico1.add_serie('Temperatura exterior (ºC)', Color.asulito) self.grafico1.add_serie('Temperatura interior (ºC)', Color.morado) self.grafico2.set_ejes(duracion, intervalo_muestreo, None, None,10) self.grafico2.add_serie('Humedad exterior (%)', Color.asulito) self.grafico3.set_ejes(duracion, intervalo_muestreo, 0, 20, 5) self.grafico3.add_serie('Velocidad del viento (km/h)', Color.naranja) self.grafico3.add_serie('Rachas (km/h)', Color.morado) self.grafico4.set_ejes(duracion, intervalo_muestreo, 0, 360, 90) self.grafico4.add_serie('Dirección del viento (º)', Color.rojo) self.grafico5.set_ejes(duracion, intervalo_muestreo, None, None, 1) self.grafico5.add_serie('Presión (mbar)', Color.negro) self.grafico6.set_ejes(duracion, intervalo_muestreo, 0, 20, 5) self.grafico6.add_serie('Lluvia (mm)', Color.asulito) self.grafico6.add_serie('Lluvia últ. hora (mm)', Color.naranja) self.win.show_all() self._update_inicial_graficos() self._update_ui() GLib.timeout_add(intervalo_muestreo *1000, self._update_ui)
class MainWindow(object): """Clase manejadora de la ventana principal. """ def __init__(self): self.primera_vez = True self.builder = Gtk.Builder() self.builder.add_from_file(UI_FILE) self.builder.connect_signals(self) self.win=self.builder.get_object('window1') self.grid_graf=self.builder.get_object('grid_graf') #~ self.grid1 = self.builder.get_object('grid1') #~ self.calendario = Gtk.Calendar() #~ self.grid1.attach(self.calendario,6,2,1,1) self.status = '' self.statusbar = self.builder.get_object('statusbar') self.statusbar.push(0,self.status) self.ui_label = {} for label in labels: self.ui_label[label] = self.builder.get_object(label) ancho = 400 alto = 150 self.grafico1 = StripChart(ancho, alto, font_face='Noto Sans', font_size=11) self.grafico2 = StripChart(ancho, alto, font_face='Noto Sans', font_size=11) self.grafico3 = StripChart(ancho, alto, font_face='Noto Sans', font_size=11) self.grafico4 = StripChart(ancho, alto, tipo='puntos', font_face='Noto Sans', font_size=11) self.grafico5 = StripChart(ancho, alto, font_face='Noto Sans', font_size=11) self.grafico6 = StripChart(ancho, alto, font_face='Noto Sans', font_size=11) self.grid_graf.attach(self.grafico1,0,0,1,1) self.grid_graf.attach(self.grafico2,1,0,1,1) self.grid_graf.attach(self.grafico3,0,1,1,1) self.grid_graf.attach(self.grafico4,1,1,1,1) self.grid_graf.attach(self.grafico5,0,2,1,1) self.grid_graf.attach(self.grafico6,1,2,1,1) self.grafico1.set_ejes(duracion, intervalo_muestreo, None, None, 5) self.grafico1.add_serie('Temperatura exterior (ºC)', Color.asulito) self.grafico1.add_serie('Temperatura interior (ºC)', Color.morado) self.grafico2.set_ejes(duracion, intervalo_muestreo, None, None,10) self.grafico2.add_serie('Humedad exterior (%)', Color.asulito) self.grafico3.set_ejes(duracion, intervalo_muestreo, 0, 20, 5) self.grafico3.add_serie('Velocidad del viento (km/h)', Color.naranja) self.grafico3.add_serie('Rachas (km/h)', Color.morado) self.grafico4.set_ejes(duracion, intervalo_muestreo, 0, 360, 90) self.grafico4.add_serie('Dirección del viento (º)', Color.rojo) self.grafico5.set_ejes(duracion, intervalo_muestreo, None, None, 1) self.grafico5.add_serie('Presión (mbar)', Color.negro) self.grafico6.set_ejes(duracion, intervalo_muestreo, 0, 20, 5) self.grafico6.add_serie('Lluvia (mm)', Color.asulito) self.grafico6.add_serie('Lluvia últ. hora (mm)', Color.naranja) self.win.show_all() self._update_inicial_graficos() self._update_ui() GLib.timeout_add(intervalo_muestreo *1000, self._update_ui) def _update_inicial_graficos(self): global err_conexion peticion = 'getfile ' + date.today().isoformat() + '.dat\r\n' # Fichero del dia conexion.send(peticion.encode()) fichero = '' while True: chunk = conexion.recv(4096).decode() if len(chunk): fichero += chunk if '\v' == fichero[-1]: break; else: err_conexion = True self.status += ' ERROR DE CONEXION.' return lineas_fichero = fichero[:-2].split('\n') # Quita '\n\v' del final del fichero for linea in lineas_fichero: linea_sin_hora = linea.split(',')[2:] # Elimina fecha y hora al principio datos=[float(x) for x in linea_sin_hora] self._update_graficos(datos) def _update_labels(self, datos): for l,f,v in zip(labels, formatos, datos): self.ui_label[l].set_label(f.format(v)) self.status = 'Último acceso: ' + datetime.now().strftime('%x %X') +\ ' Recepción: {:5.1f}%'.format(100.0 * datos[11] / 54.0) # Datos calculados self.ui_label['d_temp_out_max'].set_label(str(self.grafico1.datos[0].maximo)) self.ui_label['d_temp_out_min'].set_label(str(self.grafico1.datos[0].minimo)) self.ui_label['d_temp_in_max'].set_label(str(self.grafico1.datos[1].maximo)) self.ui_label['d_temp_in_min'].set_label(str(self.grafico1.datos[1].minimo)) self.ui_label['d_hum_out_max'].set_label(str(self.grafico2.datos[0].maximo)) self.ui_label['d_hum_out_min'].set_label(str(self.grafico2.datos[0].minimo)) self.ui_label['d_wind_vel'].set_label(str(round(self.grafico3.datos[0].maximo,1))) self.ui_label['d_wind_racha'].set_label(str(round(self.grafico3.datos[1].maximo,1))) self.ui_label['d_rel_pressure_max'].set_label(str(round(self.grafico5.datos[0].maximo,1))) self.ui_label['d_rel_pressure_min'].set_label(str(round(self.grafico5.datos[0].minimo,1))) def _update_graficos(self,datos): self.grafico1.add_valor(0, datos[0]) self.grafico1.add_valor(1, datos[10]) self.grafico2.add_valor(0, datos[1]) self.grafico3.add_valor(0, datos[6]) self.grafico3.add_valor(1, datos[7]) self.grafico4.add_valor(0, datos[8]) self.grafico5.add_valor(0, datos[9]) self.grafico6.add_valor(0, datos[5]) self.grafico6.add_valor(1, datos[4]) self.grafico1.update() self.grafico2.update() self.grafico3.update() self.grafico4.update() self.grafico5.update() self.grafico6.update() def _update_ui(self): global err_conexion self.statusbar.pop(0) if not err_conexion: conexion.send("getcurrent\r\n".encode()) respuesta = conexion.recv(128).decode() if len(respuesta)>0: datos=[float(x) for x in respuesta.split(',')] self._update_labels(datos) if not self.primera_vez: self._update_graficos(datos) else: err_conexion = True self.status += ' ERROR DE CONEXION.' self.statusbar.push(0, self.status) self.primera_vez = False return True def on_window_destroy(self,win): Gtk.main_quit() def run(self): Gtk.main()