2014-01-17 38 views
0

所以在这里我试图让一个进度条是0%红色,其颜色逐渐变化,直到100%绿色,但我不知道该怎么办它。红色到绿色进度条使用GTK3和Python

我试着通过一个CssProvider重新着色内置的gtk.ProgressBar来完成它,但是底层的css样式非常混乱,我无法使它工作 - 更不用说我无法设法混合所需的颜色。

我认为从头开始使用cairo绘制自己的小部件,但是我无法在网上找到关于如何操作的任何指南。

目前我正试图在Ubuntu下完成这项工作,但独立平台的解决方案肯定会更好。

编辑最终我用下面的代码解决了它。这是一个使用gtk.Table的解决方法。酒吧的背景不是彩色的(我尝试过,但不能给桌子本身一个背景颜色)。进度部分用颜色的自顶向下渐变着色,并具有3px圆角。虽然这个版本仍然是静态的,但我做的slightly modified version可以是动态的(有限制)。

class mybar(gtk.Table): 

    def __init__(self, total, now, label): 

     super(mybar, self).__init__(1, total, True) 
     self.set_size_request(150,5) ## just set a size for it 
     self.show() 

     self.id = 'mybar'+str(id(self)) ## unique id for the css 
     self.set_name(self.id) 

     self.set_tooltip_text(u'%s: %d/%d' % (label, now, total)) ## Label: current/max 

     bar = gtk.Label() 
     bar.show() 

     p = now/float(total) 
     m = 0.7 ## this makes the colors darker, 1 for full brightness 0 for black 
     if p < 0.5: 
      r = m 
      g = p*2*m 
     elif p > 0.5: 
      r = (1-p)*2*m 
      g = m 
     else: 
      r = m 
      g = m 
     color = gdk.RGBA(r,g,0,1) 

     ##print color.to_string() ## uncomment this to print the current color rgb to terminal 

     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)) 

     bar.get_style_context().add_provider(css, gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) 

     self.attach(bar, 0, now, 0, 1) 

回答