我有一个小脚本,用于生成具有预定义字体和文本的图像。我想将其更改为使用多种字体来呈现相同的文本,例如5个字体中的字母A
。我将我的字体列表定义为:
fonts = [ 'Georgia', 'Consolas', 'Arial'
]
然后我用它:
for item in enumerate(fonts) :
...
我想生成所有列表,例如Times New Roman系列字体。我试图用正则表达式生成列表,但没有运气。我真的不知道如何将它嵌入列表中(带引号,开头和结尾都有/
等)。
我尝试过这样的事情:fonts = [ '/^.Times.*$/' ]
和fonts = [ '/Times.*/g' ]
,但没有成功。
当我想使用像Luicida Console Regular
这样的3字字体时出现Seond问题,然后我收到了这个错误:
C:\Users\xxx\Desktop\test.py:46: PangoWarning: couldn't load font "Luicid
a Console 40", falling back to "Sans 40", expect ugly output.
pangctx.show_layout (layout)
看起来脚本只从字体名称中获取两个单词。
修改
def main ():
surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
context = cairo.Context (surface)
source = context.get_source ()
font = sys.argv[1]
fonts = [ 'Georgia', 'Consolas', 'Arial', 'Lucida Console', 'Times New Roman' ]
output = sys.argv[2]
text = sys.argv[3]
background = cairo.SolidPattern (255, 255, 255)
context.rectangle (0, 0, WIDTH, HEIGHT)
context.set_source (background)
context.fill ()
pangctx = pangocairo.CairoContext (context)
layout = pangctx.create_layout ()
layout.set_width ((WIDTH - 2 * PADDING) * pango.SCALE)
layout.set_single_paragraph_mode (True)
layout.set_wrap (pango.WRAP_CHAR)
size = 40 * pango.SCALE
spacing = 10 * pango.SCALE
markup = ''
for index, item in enumerate(fonts):
print index, item
markup += '<span font="'+ item +'" size="' + str(size) + '" letter_spacing="' + str(spacing) + '">' + text +'</span>'
layout.set_markup (markup)
pangctx.update_layout (layout)
context.new_path ()
context.move_to (PADDING, PADDING)
context.set_source (source)
context.set_source_rgb (0, 0, 0)
pangctx.show_layout (layout)
surface.write_to_png (output)
修改 似乎这仍然是pango launchpad link
中的一个错误答案 0 :(得分:2)
首先,您的尝试中似乎存在拼写错误。它是“Lucida”,而不是“Luicida”
其次,你似乎在使用Pango?为什么不用它来列出所有可用的字体变体?参见例如pygtk tutorial。
编辑:查看您的代码以及Pango Markup Language的引用,似乎“font”不是有效属性。请改为使用“font_family”。
答案 1 :(得分:2)
获取所有可用字体名称的列表:
fonts = [f.get_name() for f in layout.get_context().list_families()]
仅保留与正则表达式匹配的字体,例如,选择名称中包含mono
或space
的字体(不区分大小写):
mono_fonts = filter(re.compile(r'(?i)mono|space').search, fonts)
顺便说一句,使用字符串格式而不是+
运算符可能更具可读性:
markup += '<span font="{}" size="{}" letter_spacing="{}">{}</span>'.format(
item, size, spacing, text)
font
属性似乎对我有用:
>>> import cairo
>>> import pango
>>> cairo.version
'1.8.8'
>>> pango.version_string()
'1.29.3'
答案 2 :(得分:1)
根据正则表达式匹配过滤列表fonts
。
import re
r = re.compile("Times.*")
for item in enumerate(f for f in fonts if r.match(f)):
...
在您的情况下,您可以检查字符串包含:
for item in enumerate(f for f in fonts if f.contains("Times")):
...
您需要提供第二个错误的更多详细信息。
答案 3 :(得分:1)
这将生成字体列表中以“Times”开头的所有字体的列表:
timesFonts = filter(lambda x: re.match(r'^Times.*', x), fonts)