PyGTK: CellRendererPixbuf и прозрачность - PullRequest
1 голос
/ 09 октября 2011

Я использую PyGTK и хочу нарисовать что-то внутри CellRenderer, поэтому я использую CellRendererPixbuff, и он работает.Единственная проблема заключается в том, что если этот рисунок имеет прозрачность, выходные данные будут плохими и перепутаны.

Снимок экрана: 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 Ответ

1 голос
/ 14 октября 2011

У меня похожая проблема, и она, похоже, проистекает из gdk.Pixmap, но у меня пока нет решения.

Редактировать: я решил свою проблему, используя вместо этого gtk.gdk.pixbuf_new_from_xpm_data() для генерации pixbufgdk.Pixmap и операции в Каире.Я знаю, что вы не можете использовать его, потому что у вас есть параметры size и roundR.

Возможно, вы можете заполнить gdk.Pixmap цветом, который вы замените на gtk.gdk.Pixbuf.add_alpha(), когда pixbuf будетбыть сгенерированным.

...