2011-10-09 53 views
1

我正在使用PyGTK,我想绘制一个CellRenderer内的东西,所以我使用了CellRendererPixbuff,它正在工作。唯一的问题是,如果该绘图具有透明度,则输出会很糟糕并混淆。PyGTK:CellRendererPixbuf和透明度

截图:http://postimage.org/image/f839ijd0/

我的代码:

def pixbufSqFromColor(color, size, roundR=0):## a rounded square with specified color 
    pmap = gdk.Pixmap(None, size, size, depth=24) 
    cr = pmap.cairo_create() 
    ### 
    #cr.rectangle(0, 0, size, size) 
    #fillColor(cr, (255, 255, 255, 0)) 
    ### 
    cr.move_to(roundR, 0) 
    cr.line_to(size-roundR, 0) 
    cr.arc(size-roundR, roundR, roundR, 3*pi/2, 2*pi) ## up right corner 
    cr.line_to(size, size-roundR) 
    cr.arc(size-roundR, size-roundR, roundR, 0, pi/2) ## down right corner 
    cr.line_to(roundR, size) 
    cr.arc(roundR, size-roundR, roundR, pi/2, pi) ## down left corner 
    cr.line_to(0, roundR) 
    cr.arc(roundR, roundR, roundR, pi, 3*pi/2) ## up left corner 
    ### 
    cr.close_path() 
    fillColor(cr, color) 
    #### 
    pbuf = gdk.Pixbuf(gdk.COLORSPACE_RGB, True, 8, size, size) 
    colormap = gtk.gdk.colormap_get_system() 
    #colormap = self.get_screen().get_system_colormap() 
    #colormap = pmap.get_colormap() 
    pbuf.get_from_drawable(pmap, colormap, 0, 0, 0, 0, size, size) 
    return pbuf 
    #return gdk.Pixbuf.get_from_drawable(pmap, gdk.COLORSPACE_RGB, 0, 0, 0, 0, size, size) 

而这正是该功能用于

 groupNode = self.treestore.append((
      -1, 
      group.enable, 
      pixbufSqFromColor(group.color, 50, 15), 
      group.title, 
      '', 
     )) 

和一些使用的功能在这里:

def setColor(cr, color): 
    ## arguments to set_source_rgb and set_source_rgba must be between 0 and 1 
    if len(color)==3: 
     cr.set_source_rgb(color[0]/255.0, 
          color[1]/255.0, 
          color[2]/255.0) 
    elif len(color)==4: 
     cr.set_source_rgba(color[0]/255.0, 
          color[1]/255.0, 
          color[2]/255.0, 
          color[3]/255.0) 
    else: 
     raise ValueError('bad color %s'%str(color)) 


def fillColor(cr, color): 
    setColor(cr, color) 
    cr.fill() 

回答

1

我有类似的问题,似乎来自gdk.Pixmap,但我还没有解决方案。

编辑: 我已经通过使用gtk.gdk.pixbuf_new_from_xpm_data()生成pixbuf而不是gdk.Pixmap和Cairo操作来解决我的问题。我知道你不能使用它,因为你有sizeroundR参数。

也许你可以填充gdk.Pixmap的颜色,当pixbuf生成时,你将用gtk.gdk.Pixbuf.add_alpha()代替。

+0

谢谢,第二个解决方案是好的,但(apearantly)不完美。作为矢量绘图的截图,请参阅此截图:http://postimage.org/image/1dplqqls4/61343501/ – saeedgnu