将 PangoCairo 与 PyGObject API 结合使用

Kev*_*eau 5 python pango pygobject pycairo pangocairo

我正在移植一个使用 Pango 将文本绘制到开罗表面的 Python2 脚本。使用带有pangocairo包的旧 PyGtk API 可以正常工作。我的系统 (Debian Jesse) 没有用于 PyGtk 的 Python3 软件包,而是使用带有 PyGObject API 的较新的 Gtk+ 库。

我想创建一个pangocairo.CairoContext对象,但新 API 中似乎缺少它。该PangoCairo包有一个create_context()函数,但它生成的PangoContext对象没有我需要的方法。

到目前为止,我有这个:

import cairo
from gi.repository import Pango
from gi.repository import PangoCairo

surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, 8, 8)
ctx = cairo.Context(surf)
pctx = PangoCairo.create_context(ctx) # Creates a PangoContext
pctx.set_antialias(cairo.ANTIALIAS_SUBPIXEL) # This fails
Run Code Online (Sandbox Code Playgroud)

有效的旧 Python2 代码:

import cairo
import pango
import pangocairo

surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, 8, 8)
ctx = cairo.Context(surf)
pctx = pangocairo.CairoContext(ctx)
pctx.set_antialias(cairo.ANTIALIAS_SUBPIXEL)
Run Code Online (Sandbox Code Playgroud)

有没有人对此有解决方案?是否有关于如何PangoCairo与新 API 一起使用的好的文档?

Kev*_*eau 5

看起来图书馆已经重新排列了一点。现在Pango.ContextPango.Layout对象中检索Pango 上下文(现在)。这是一个有效的解决方案:

import cairo
from gi.repository import Pango
from gi.repository import PangoCairo

surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, 8, 8)
ctx = cairo.Context(surf)
layout = PangoCairo.create_layout(ctx)
pctx = layout.get_context()

fo = cairo.FontOptions()
fo.set_antialias(cairo.ANTIALIAS_SUBPIXEL)
PangoCairo.context_set_font_options(pctx, fo)
Run Code Online (Sandbox Code Playgroud)

  • “现在从 Pango.Layout 对象中检索 Pango 上下文(现在是 Pango.Context)。” 这不是您的解决方案有效的原因。"pctx = PangoCairo.create_context(ctx)" 的工作方式相同。您更改了设置抗锯齿的代码。 (2认同)