I really needed a progress bar that changes from red to green as it progresses. Well, I made one. Though it doesn’t support labels as the built-in GTK ProgressBar, one can easily be added next to the bar, or (if it’s static) in a tooltip. Also, not removing self.bar would result in an actual red-to-green gradient, instead of a color-changing bar. (Though it should still be removed when the bar is reset.)
#!/usr/bin/env python
#coding=utf-8
from gi.repository import Gtk as gtk, GObject as gobj, Gdk as gdk
class mybar(gtk.Table):
def __init__(self, p):
super(mybar, self).__init__(1, 100, True)
self.show()
self.id = 'mybar'+str(id(self)) ## unique id for the css
self.set_name(self.id)
self.p = p
self.update_w(self.p)
def update_w(self, p):
if 'bar' in dir(self): ## don't remove it if it's not there
self.remove(self.bar)
self.p = p
self.bar = gtk.Label()
self.bar.show()
m = 0.8 ## this makes the colors darker, 1 for full brightness 0 for black
if self.p < 0.5:
r = m
g = self.p*2*m
elif self.p > 0.5:
r = (1-self.p)*2*m
g = m
else:
r = m
g = m
color = gdk.RGBA(r,g,0,1)
css = gtk.CssProvider()
css.load_from_data('''
@define-color barcolor %s;
#%s GtkLabel {
font:6px;
background:-gtk-gradient (linear, center top, center bottom, from (shade (@barcolor, 1.05)), color-stop (0.5, @barcolor), to (shade (@barcolor, 0.95)));
border-radius:3px;
}
''' % (color.to_string(), self.id) )
self.bar.get_style_context().add_provider(css, gtk.STYLE_PROVIDER_PRIORITY_APPLICATION )
if p == 0:
p = 0.01 ## if it's 0 GTK throws an error
self.attach(self.bar, 0, int(100*p), 0, 1)
class pbarwin(gtk.Window):
def __init__(self):
super(pbarwin, self).__init__(title="Red to green progress bar")
self.set_border_width(10)
self.set_position(1)
self.pbar = mybar(0)
self.pbar.set_size_request(200,10)
self.add(self.pbar)
self.timeout_id = gobj.timeout_add(100, self.main)
def main(self):
new = self.pbar.p + 0.01
if new > 1:
new = 0
self.pbar.update_w(new)
return True ## need True to keep loop running
win = pbarwin()
win.connect("delete-event", gtk.main_quit)
win.show_all()
gtk.main()