2012-02-26 15 views
0

私は、あらかじめ定義されたフォントとテキストの画像を生成するために使用される小さなスクリプトを用意しています。私は複数のフォントを使用して同じテキストをレンダリングするように変更したいと思います。手紙A 5フォント。私は私のようなフォントのリストを定義しています:Pythonの正規表現を使ってリストを生成する

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

し、私はそれを使用します。私はすべての例でリストを生成したい

for item in enumerate(fonts) : 
... 

Times New Romanファミリーフォント。私は正規表現でリストを生成しようとしましたが、運がありません。 fonts = [ '/^.Times.*$/' ]このfonts = [ '/Times.*/g' ]が、成功しません:私は本当に私はこのような何かを試してみました

(最初と最後で/などで、引用符で)リストに埋め込む方法がわかりません。私はLuicida Console Regularのような3つのワードのフォントを使用したいとき

Seond問題が発生した場合、私はこのエラーを得た:スクリプトはフォント名から2つだけの単語を取得しているよう

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) 

が見えます。

EDIT

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) 

EDIT が、これはまだPangoのバグlaunchpad link

+0

あなたは正規表現がそこで有効であり、地獄が何であると信じますか?「Luicida Consol e? –

+0

@ IgnacioVazquez-Abrams "Luicida Console Regular"は、少なくとも私のシステム(Win7)のフォントです。正規表現が有効であるということはどういう意味ですか? – Patryk

+0

いいえ、それはありません。何をあなたが渡しているものであれ、正規表現が使用されると信じるようになったのは何ですか? –

答えて

2

、名前(大文字と小文字を区別しない)にmonoまたはspaceを持っているフォントを選択します

markup += '<span font="{}" size="{}" letter_spacing="{}">{}</span>'.format(
         item, size, spacing, text) 

font

mono_fonts = filter(re.compile(r'(?i)mono|space').search, fonts) 

ところで、代わりの+オペレータの書式文字列を使用する方が読みやすいかもしれません属性は私にとってはうまくいくようです:

>>> import cairo 
>>> import pango 
>>> cairo.version 
'1.8.8' 
>>> pango.version_string() 
'1.29.3' 
+0

ありがとうsoo多く:)それは完全に動作します。 – Patryk

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

あなたは2番目のエラーのためのより多くの詳細を提供する必要があります。

1

これはあなたのフォントリストに「タイムズ」で始まるすべてのフォントのリストが得られます:

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

まず、あなたの試みでスペルエラーがあるように思われます。それは "Luicida"ではなく "Lucida"です

第2に、Pangoを使用しているようですか?利用可能なすべてのフォントのバリエーションを一覧表示するのに使ってみませんか?例えば、 pygtk tutorial

編集:あなたのコードとPango Markup Languageの参照を見ると、「font」は有効な属性ではないようです。代わりに "font_family"を試してください。例えば、正規表現に一致するフォントのみを残すために

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

:すべての利用可能なフォント名のリストを取得するには

+0

それを指摘してくれてありがとう。私はまだこのTimes New Romanの問題を抱えていますが、スクリプトはRomanの単語を読んでいません - [pastebin](http://pastebin.com/Hdj6iNyb) – Patryk

+0

質問を編集して完全なコードを表示できますか、少なくともPangoあなたが使っている通話は? –

+0

私はソースコードを追加しました。 – Patryk