Ras*_*sWL 9 python pango pygobject
我正在使用Pango + Cairo(通过GObject)使用python3.7渲染文本,并想通过创建属性并将该属性附加到我的pango布局来设置字母间距。
在pango的gnome文档中,我可以看到应该有一个名为pango_attr_letter_spacing_new(自v1.6起)的函数。但是,如果运行,则会Pango.attr_letter_spacing_new出现错误:
AttributeError: 'gi.repository.Pango' object has no attribute 'attr_letter_spacing_new'
Run Code Online (Sandbox Code Playgroud)
感觉有点奇怪,因为我可以使用pango_attr_type_get_name从v1.22开始才应该提供的。
我可以通过使用标记来解决,<span letter_spacing="1234">但是我不想走这条路。
AttributeError: 'gi.repository.Pango' object has no attribute 'attr_letter_spacing_new'
Run Code Online (Sandbox Code Playgroud)
我已经能够找到enum值Pango.AttrType.LETTER_SPACING,这使我可以执行以下操作:
c = Pango.AttrClass()
c.type = Pango.AttrType.LETTER_SPACING
a = Pango.Attribute()
a.init(c)
Run Code Online (Sandbox Code Playgroud)
但是,我一直无法找到一种方法来设置它的值,这让我觉得这是错误的处理方法:|
将此插入到中Pango.AttrList,给了一个错误(不足为奇),并且下次我对Pango进行操作时使python进程出现段错误:
** (process:17183): WARNING **: 12:00:56.985: (gi/pygi-struct-marshal.c:287):pygi_arg_struct_from_py_marshal: runtime check failed: (g_type_is_a (g_type, G_TYPE_VARIANT) || !is_pointer || transfer == GI_TRANSFER_NOTHING)
Run Code Online (Sandbox Code Playgroud)
..可悲的是无处可去:(
pango.AttrLetterSpacing
Pango.AttrLetterSpacing => 'gi.repository.Pango' object has no attribute 'AttrLetterSpacing'Pango.Attrbute.LetterSpacing => type object 'Attribute' has no attribute 'LetterSpacing'attr_letter_spacing_new功能 -并没有太大帮助,但建议该功能应可通过GObject使用,尽管我没有尝试过。看起来这个问题已经解决了,使用 pycairo 1.20.0 和 PyGObject 3.40.1:
import cairo
import gi
gi.require_version('Pango', '1.0')
gi.require_version('PangoCairo', '1.0')
from gi.repository import Pango, PangoCairo
width, height = 328, 48
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
context = cairo.Context(surface)
layout = PangoCairo.create_layout(context)
font_desc = Pango.font_description_from_string('Sans, 40px')
layout.set_font_description(font_desc)
letter_spacing_attr = Pango.attr_letter_spacing_new(1024 * 10)
attr_list = Pango.AttrList()
attr_list.insert(letter_spacing_attr)
layout.set_attributes(attr_list)
layout.set_text('Hello World')
PangoCairo.show_layout(context, layout)
with open('help-me.png', 'wb') as image_file:
surface.write_to_png(image_file)
Run Code Online (Sandbox Code Playgroud)