2012-02-26 50 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