More Related Content Similar to Gtk+陷阱与进阶技巧 (20) Gtk+陷阱与进阶技巧6. propagate_expose 函数实现
def propagate_expose (widget, event):
'''Propagate expose event to children.'''
if "get_child" in dir(widget) and widget.get_child() !=
None:
widget.propagate_expose(widget.get_child(), event)
8. 临时关闭反锯齿的代码
@contextmanager
def cairo_disable_antialias(cr):
'''Disable cairo antialias temporary.'''
# Save antialias.
antialias = cr.get_antialias()
cr.set_antialias(cairo.ANTIALIAS_NONE)
try:
yield
except Exception, e:
print 'with an cairo error %s' % e
else:
# Restore antialias.
cr.set_antialias(antialias)
with cairo_disable_antialias(cr):
......
13. GTK+ 不规则窗口代码, 步骤一:
# 创建形状位图。
x, y, w, h = rect.x, rect.y, rect.width, rect.height
bitmap = gtk.gdk.Pixmap(None, w, h, 1)
cr = bitmap.cairo_create()
14. GTK+ 不规则窗口代码, 步骤二:
# 清空画布。
cr.set_source_rgb(0.0, 0.0, 0.0)
cr.set_operator(cairo.OPERATOR_CLEAR)
cr.paint()
15. GTK+ 不规则窗口代码, 步骤三:
# 绘制窗口形状。
cr.set_source_rgb(1.0, 1.0, 1.0)
cr.set_operator(cairo.OPERATOR_OVER)
cr.arc(x + w / 2, y + h / 2, w / 2, 0, 2 * pi)
cr.fill()
25. 发送图形回调至主线程执行
def post_gui(func):
'''Post GUI code in main thread.'''
def wrap(*a, **kw):
gtk.gdk.threads_enter()
ret = func(*a, **kw)
gtk.gdk.threads_leave()
return ret
return wrap
@post_gui
def render_func(...):