gpt4 book ai didi

python - 如何使用 pycairo 创建字母间距属性?

转载 作者:行者123 更新时间:2023-12-04 04:27:57 25 4
gpt4 key购买 nike

我正在使用 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'

这感觉有点奇怪,因为我可以使用 pango_attr_type_get_name 这应该只从 v1.22 开始可用。

我通过使用带有 <span letter_spacing="1234"> 的标记来解决问题但我宁愿不走这条路。

最小的“工作”示例

# pip install pycairo==1.18.0 pygobject==3.32.0

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)

# What I can do
layout.set_markup(f'<span letter_spacing="{1024 * 10}">Hello World</span>')

# What I would like to do
if False:
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)

手动创建 LetterSpacing 属性

我已经能够找到枚举值 Pango.AttrType.LETTER_SPACING ,这让我可以做这样的事情:
c = Pango.AttrClass()
c.type = Pango.AttrType.LETTER_SPACING
a = Pango.Attribute()
a.init(c)

但是,我一直无法找到设置它的值(value)的方法,这让我认为这是处理事情的错误方法:|

将此插入 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)

其他线索

..可悲的是无处可去:(
  • pygtk listing a function pango.AttrLetterSpacing
  • Pango.AttrLetterSpacing => 'gi.repository.Pango' object has no attribute 'AttrLetterSpacing'
  • Pango.Attrbute.LetterSpacing => type object 'Attribute' has no attribute 'LetterSpacing'
  • Vala 的 pango 包的文档(似乎也使用 GObject),还显示了 attr_letter_spacing_new function -- 这并没有多大帮助,但建议该功能应该通过 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)

    关于python - 如何使用 pycairo 创建字母间距属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55533312/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com