2012-02-26 47 views
0

我具有被用于产生具有预定义的字体和文本的图像的小脚本。我想改变它使用多种字体来呈现相同的文本,例如字母A 5种字体。我定义我的字体列表如下:在Python使用正则表达式来产生列表

fonts = [ 'Georgia', 'Consolas', 'Arial']

,然后我用它:

for item in enumerate(fonts) : 
... 

我想生成所有例如列表Times New Roman家庭字体。我试图用正则表达式生成列表,但没有运气。我真的不知道该如何将它嵌入在列表中(带引号,用/在开始和结束等)

我已经试过这样的事情:fonts = [ '/^.Times.*$/' ]fonts = [ '/Times.*/g' ],但没有成功。

Seond问题出现了,当我想用​​3名字的字体像Luicida Console Regular,然后我得到这个错误:

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) 

编辑 看来,这仍是攀高launchpad link

+0

为什么你认为一个正则表达式在那里是有效的,什么是“Luicida Consol E“? – 2012-02-26 18:08:42

+0

@ IgnacioVazquez-Abrams“Luicida Console Regular”是一种字体 - 至少在我的系统(Win7)上。 '正则表达式在那里有效'是什么意思? – Patryk 2012-02-26 18:15:18

+0

不,它不是。是什么让你相信一个正则表达式会被你传递给它的任何东西所使用? – 2012-02-26 18:18:45

回答

2

要获得所有可用的字体名称的列表:

fonts = [f.get_name() for f in layout.get_context().list_families()] 

,只留下那些如匹配正则表达式的字体,选择那些在名称monospace(不区分大小写)字体:

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' 
+0

谢谢你soo :)完美的作品。 – Patryk 2012-02-26 20:39:35

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")): 
    ... 

你需要为第二个错误提供更多的细节。

1

这将产生所有在你的字体列表与“泰晤士报”开始的字体列表:

timesFonts = filter(lambda x: re.match(r'^Times.*', x), fonts) 
2

首先,似乎是在你尝试拼写错误。这是“龙力”,而不是“Luicida”

其次,看来你是使用攀高?为什么不使用它来列出所有可用的字体变体?见例如pygtk tutorial

编辑:看你的代码,并为Pango Markup Language参考,似乎“字体”不是一个有效的属性。改为尝试“font_family”。

+0

谢谢你指出。虽然我仍然得到这个时代的新罗马问题 - 脚本不读'罗马字' - [pastebin](http://pastebin.com/Hdj6iNyb) – Patryk 2012-02-26 18:23:54

+0

你可以编辑问题来显示完整的代码,或者至少是Pango你使用的电话? – 2012-02-26 18:53:22

+0

我已添加源代码。 – Patryk 2012-02-26 19:00:33