En fin, hay muchas formas de hacerlo, y Cairo me llamo la atención, ya que se integra con Python y GTK. Mi idea fue crear un progress bar algo distinto (sólo con fines de probar), en el cuál si cargaba hasta el 50% se mostrara en rojo, si cargaba hasta el 80% se mostrara en amarillo y el resto en azul. Y al completarse todo la carga, se muestre un texto "100% completo" sobre un fondo degradado:
Para ello trabaje, no enrrollandome con puro código gtk para crear una ventanita, sino usando glade.
Aquí use aquella herramienta que no había usado hasta ahora, el drawingarea.
Bueno el código quedó de la siguiente forma:
#!/usr/bin/python # -*- coding: utf-8 -*- import gtk import glib import cairo class App(object): def __init__ (self): #Iniciamos el porcentaje de carga self.percent = 0 #Se carga el archivo glade builder = gtk.Builder() builder.add_from_file('Final.ui') #Se recuperan los widget a usar self.winMain = builder.get_object('window1') self.drawingarea = builder.get_object('drawingarea1') #Instanciamos nuestro widget self.pbBGR = ProgressBarBGR(self.drawingarea) #Conectamos las señales y mostramos la ventana builder.connect_signals(self) self.winMain.show() def on_btnIniciar_clicked(self, *args): #Ejecutamos el mètodo cada 20ms glib.timeout_add(20, self.on_timer) def on_timer(self): #Incrementamos el porcentaje self.percent += 1 #Trabajamos con nuestro widget self.pbBGR.setPercent(self.percent) # INSERTAMOS PORCENTAJE self.pbBGR.draw() # DIBUJAMOS if self.percent > 99: self.percent = 0 return False return True class ProgressBarBGR(): def __init__(self, drawingarea): self.__percent = 0 # Ocultamos nuestra variable self.drawingarea = drawingarea self.drawingarea.connect("expose-event", self.expose) def setPercent(self, percent): self.__percent = percent def getPercent(self): return self.__percent def draw(self): self.drawingarea.queue_draw() def expose(self, widget, event): #Creamos el contexto cr = widget.window.cairo_create() #Determinamos eje x, eje y, ancho y alto del área de dibujo x, y = event.area.x, event.area.y width, height = event.area.width, event.area.height #Dibujamos el rectángulo principal cr.set_line_width(2) cr.rectangle(x, y, width, height) cr.set_source_rgb(0, 0, 0) cr.fill() #Dibujamos los 100 rectángulos y ponemos colores h = height w = width / 100.0 perc = self.getPercent() if perc > 0: for i in range(0,100): if i <= perc and i < 50: cr.set_source_rgb(1, 0, 0) elif i <= perc and i >= 50 and i <=80: cr.set_source_rgb(1, 1, 0) elif i <= perc and i > 80 and i <=99: cr.set_source_rgb(0, 0.5, 0.9) else: cr.set_source_rgb(0, 0, 0) cr.rectangle( w * i, 0, w -1, h) cr.fill() #Dibujamos la barra completada al 100% if perc == 100: #Degradamos lg = cairo.LinearGradient(x, y, x, height) lg.add_color_stop_rgba(0.1, 0, 0, 0, 1) lg.add_color_stop_rgba(0.5, 0, 0.6, 1, 1) lg.add_color_stop_rgba(0.9, 0, 0, 0, 1) cr.rectangle(x, y, width, height) cr.set_source(lg) cr.fill() #Insertamos el texto de 100% cr.select_font_face("Serif", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD) if height < 100: cr.set_font_size( height/2.5) else: cr. set_font_size((width + height) / 20) texto = "100% COMPLETO" (x, y, txtwidth, txtheight, dx, dy) = cr.text_extents(texto) cr.set_source_rgb(0.5, 0.5, 0.5) cr.move_to(width/2 - txtwidth/2, h/2 + txtheight/2) cr.show_text(texto) cr.set_source_rgb(1, 1, 1) cr.move_to(width/2 - txtwidth/2 + 2, h/2 + txtheight/2 +2 ) cr.show_text(texto) if __name__ == "__main__": App() gtk.main()
PD: esto fue desarrollado con PyGTK, facilmente se puede cambiar el código a PyGI. Por ejemplo:
en vez de usar "expose-event" se podría usar "draw". Es cuestión de revisar la documentación.
No hay comentarios:
Publicar un comentario