2012-02-26 2 views
0

У меня есть небольшой скрипт, который используется для создания изображения с предопределенным шрифтом и текстом. Я хотел бы изменить его, чтобы использовать несколько шрифтов для отображения одного и того же текста, например. письмо A в 5 шрифтах. Я определяю мой список шрифтов, как:Использование регулярного выражения в Python для создания списка

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

, а затем я использую его в:

for item in enumerate(fonts) : 
... 

Я хотел бы создать список со всеми, например, Времена Новые римские семейные шрифты. Я пытался создать список с регулярным выражением, но без везения. Я не знаю, как вставлять его в списке (в кавычках, с / в начале и в конце, и т.д.)

Я пытался что-то вроде этого: 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) 

выглядит как сценарий получает только два слова из названия шрифта.

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 кажется, что это все-таки ошибка в Панго launchpad link

+0

Почему вы считаете, что существует регулярное выражение, и что, черт возьми, «Luicida Consol е "? –

+0

@ IgnacioVazquez-Abrams «Luicida Console Regular» - это шрифт - по крайней мере, в моей системе (Win7). Что вы подразумеваете под «regex is valid there»? – Patryk

+0

Нет, это не так. Что привело вас к мысли, что регулярное выражение будет использоваться тем, что вы передаете? –

ответ

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

Спасибо тебе, много :) Это прекрасно работает. – 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")): 
    ... 

Вам необходимо предоставить более подробную информацию для второй ошибки.

1

Это даст список всех шрифтов, которые начинаются с «Таймс» в списке шрифтов:

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

Во-первых, кажется, есть орфографическая ошибка в вашей попытке. Это «Lucida», а не «Luicida»

Во-вторых, кажется, вы используете Pango? Почему бы не использовать это, чтобы перечислить все доступные варианты шрифтов? См. pygtk tutorial.

Редактировать: Смотря на ваш код и ссылку для Pango Markup Language, кажется, что «font» не является допустимым атрибутом. Вместо этого попробуйте «font_family».

+0

Спасибо, что указали это. Хотя я все еще получаю эту проблему Times New Roman - скрипт не читает слово 'Roman' - [pastebin] (http://pastebin.com/Hdj6iNyb) – Patryk

+0

Можете ли вы отредактировать вопрос, чтобы показать полный код или, по крайней мере, Pango звонки, которые вы используете? –

+0

Я добавил исходный код. – Patryk

Смежные вопросы