如何在一个像素值设置为透明的情况下创建PyGTK像素图?我知道创建一个深度为1的像素图并将其设置为蒙版时,它有某些东西,但我发现它只是在绘制时不做任何事情或完全删除我的像素图。目前,我用
制作一个像素图r = self.get_allocation()
p1 = gtk.gdk.Pixmap(self.window,r.width,r.height)
p1_c = p1.cairo_create()
然后使用Cairo在它上面绘制黑线。我希望能够做的是让所有未被线覆盖的区域透明(使白色变成透明色,比如说),这样当我用draw_drawable绘制到窗口时,它会将所有内容留在'下面'完好。
关于此问题的常见问题解答和邮件列表帖子最无益,因为它们已经过时了。有人必须知道这里!
答案 0 :(得分:2)
我认为你不能用Pixmap
或Pixbuf
做你想做的事,但这里有两种在现有Widget
之上实施涂鸦的策略。最明显的一个就是抓住绘制事件并直接绘制到Widget
的{{1}},中间没有保留的图像:
Drawable
第二个选项,如果你想拥有一个中间ARGB图像,每次请求重绘时你都不需要更新,那就是将图像预渲染为from gtk import Window, Button, main
from math import pi
import cairo
w = Window()
b = Button("Draw on\ntop of me!")
def scribble_on(cr):
cr.set_source_rgb(0, 0, 0)
cr.rectangle(10, 10, 30, 30)
cr.fill()
cr.arc(50, 50, 10, 0, pi)
cr.stroke()
def expose_handler(widget, event):
cr = widget.window.cairo_create()
cr.rectangle(event.area.x, event.area.y,
event.area.width, event.area.height)
cr.clip()
scribble_on(cr)
return False
b.connect_after("expose_event", expose_handler)
w.add(b)
w.set_size_request(100, 100)
w.show_all()
main()
。这是上面ImageSurface
的替代,只能绘制一次图像:
expose_handler
如果这是您正在寻找的东西,我建议您更新问题的标题以反映您的真实需求:)。
答案 1 :(得分:1)
看起来你想要使用Pixbuf而不是Pixmap。 Pixbuf包含一个alpha设置,它可以提供透明度,而Pixmap则没有。